我在发送到我的某个端点时遇到错误。错误文本是:
在可以使用多对多关系之前,
"<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',
)
答案 0 :(得分:0)
由于版本号从未指定过,我将假设在修复了创建多对多关系的顺序之前,DRF版本上发生了此问题。
在Django REST Framework 3 中,您不会看到此问题,因为DRF不再自动处理相关字段。您必须实现相关对象的创建和保存,这允许您通过在创建主要字段之前创建相关字段来解决此类问题,而不是触发此问题的相反字段。
在Django REST Framework 2 中,在2.3或其他中,对象的创建顺序已得到改进,因此创建主对象后会关联多对多对象。