【问题标题】:Save many-to-many field on object create - Django DRF在对象创建时保存多对多字段 - Django DRF
【发布时间】:2021-04-30 04:58:37
【问题描述】:

如果这是一个明显的问题,请原谅我。我搜索了不同的答案,但他们没有回答我的具体情况。

我有一个具有多对多字段关系的模型。当我通过 DRF rest API 创建一个新对象时,对象(模型)的正常字段被正确保存,但多对多相关字段保持为空。

我的模型与多对多相关领域:

class CustomerProfile(models.Model):
    ...
    stores = models.ManyToManyField(Store) # <- the related field
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    email = models.EmailField(max_length=60, blank=True)
    phone = models.CharField(max_length=15, blank=True)

    def __str__(self):
        return str(self.first_name)

相关(商店)模型:

class Store(models.Model):
    store_name = models.CharField(max_length=30, unique=True, null=True)
    ...
    
    def __str__(self):
        return str(self.store_name)

我的序列化器:

class CustomerSerializer(serializers.ModelSerializer):
    stores = StoreSerializer(read_only=True, many=True)

    class Meta:
        model = CustomerProfile
        fields = ['stores', 'first_name', 'last_name', 'email', 'phone']

我的看法:

class CustomerCreate(generics.CreateAPIView):
    queryset = CustomerProfile.objects.all()
    serializer_class = CustomerSerializer

我的帖子:

axios({
    method: "POST",
    url: this.api_base_url + "api/.../customer_create/",
    data: {
        first_name: 'Tom',
        last_name: 'Hardy',
        email: 'name@gmail.com',
        phone: '01234567898',
        stores: ['store_name',], // this is the store I want to link the customer to
    }
})

当我发布到此端点时,会创建一个对象,但 stores 数组始终为空。

结果:

data:
  email: "name@gmail.com"
  first_name: "Tom"
  last_name: "Hardy"
  phone: "08038192642"
  stores: []

添加商店的正确方法是什么?

【问题讨论】:

  • 商店对象是否已经创建,即您可以通过 id 关联它们,还是要创建新的商店对象?
  • @iserranoe 是的,他们已经创建了

标签: javascript django django-rest-framework


【解决方案1】:
class CustomerSerializer(serializers.ModelSerializer):
    stores = serializers.PrimaryKeyRelatedField(queryset=Store.objects.all(), write_only=True,many=True)

    class Meta:
        model = CustomerProfile
        fields = ['stores', 'first_name', 'last_name', 'email', 'phone']

【讨论】:

  • 我收到400 (Bad Request)
  • 你会指定确切的错误吗?您是否也获得了与此处提到的相同的字段?
  • 在这种情况下,您必须发布 id,例如:"stores: [154, 26]" 否则,您应该将字段 store_name 定义为 primary_field。
  • 在postman或insomnia中查看数据可能会更好。那时调试起来很容易。这可能会帮助medium.com/@kingsleytorlowei/…
  • 我现在开始工作了。我不得不按照@iserranoe 的建议使用商店 ID
猜你喜欢
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 2018-08-09
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多