django休息框架m2m帖子

时间:2014-08-20 21:48:28

标签: django django-rest-framework

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

  在可以使用多对多关系之前,

"<Customer: person@example.com>"需要为字段"customer"设置一个值。

将客户模型设置为与地址模型具有m2m关系,并添加blank / 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',
        )

1 个答案:

答案 0 :(得分:0)

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

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

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