【问题标题】:django rest framework m2m postdjango rest 框架 m2m 帖子
【发布时间】:2014-08-20 21:48:27
【问题描述】:

我在发布到我的一个端点时遇到错误。错误文本是:

"<Customer: person@example.com>" 需要为字段 "customer" 设置一个值,然后才能使用这种多对多关系。

客户模型设置为与地址模型具有 m2m 关系,并添加了空白/null/default=None 以使其可选。

如果在序列化程序中我注释掉帐单地址字段,我的帖子会成功并创建一个新客户。

我尝试了几种有效负载,我将帐单地址指定为null[]"",但均无济于事。

型号

class Customer(TimeStamped):
    # required
    email = models.EmailField(max_length=255, unique=True)
    has_agreed_to_terms = models.BooleanField(default=False)
    ## extras
    # system id
    user = models.OneToOneField('vauth.User', related_name='customer', blank=True, null=True, default=None)
    # email preferences
    subscription_type = models.CharField(max_length=255, blank=True, null=True, default=None)
    unsubscribed_date = models.DateTimeField(blank=True, null=True, default=None)
    email_frequency = models.CharField(max_length=255, null=True, blank=True, default='Weekly')
    # addresses
    billing_addresses = models.ManyToManyField('common.Address', related_name='billing_addresses_set', blank=True, null=True, default=None)
    shipping_addresses = models.ManyToManyField('common.Address', related_name='shipping_addresses_set', blank=True, null=True, default=None)
    # time stamps
    date_joined = models.DateTimeField(default=timezone.now, db_index=True)
    first_purchase_date = models.DateTimeField(blank=True, null=True, default=None, db_index=True)
    last_purchase_date = models.DateTimeField(blank=True, null=True, default=None, db_index=True)
    # purchases
    number_of_purchases = models.IntegerField(default=0)
    # braintree
    braintree_id = models.CharField(max_length=255, blank=True, null=True, default=None)

序列化器

class CustomerSerializer(serializers.HyperlinkedModelSerializer):
    user = serializers.HyperlinkedRelatedField(view_name='user-detail', required=False)
    billing_addresses = serializers.HyperlinkedRelatedField(many=True, view_name='address-detail', required=False)
    # shipping_addresses = serializers.HyperlinkedRelatedField(many=True, view_name='address-detail', required=False)

    class Meta:
        model = Customer
        fields = (
            'url', 'id', 'email', 'has_agreed_to_terms', 'user', 'billing_addresses', #'shipping_addresses',
            'subscription_type', 'unsubscribed_date', 'email_frequency',
            'date_joined', 'first_purchase_date', 'last_purchase_date', 'number_of_purchases', 'braintree_id',
        )

【问题讨论】:

  • 您收到“客户”字段的错误有点奇怪。您确定问题出在帐单地址上吗?
  • 这是一个例子——它发生在任何使用 M2M 字段的地方。另一个例子是用户 组关系。

标签: django django-rest-framework


【解决方案1】:

由于从未指定版本号,我将假设此问题发生在 DRF 版本上,然后他们修复了创建多对多关系的顺序。

在 Django REST Framework 3 中,您不会看到此问题,因为 DRF 不再自动处理相关字段。您必须实现相关对象的创建和保存,这允许您通过在创建主要字段之前创建相关字段来解决此类问题,而不是触发此问题的反向。

在 Django REST Framework 2 中,在 2.3 或其他版本中,对象的创建顺序已得到改进,因此在创建主对象后会关联多对多对象。

【讨论】:

    猜你喜欢
    • 2017-02-19
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    • 2016-08-10
    相关资源
    最近更新 更多