django rest框架模型外键
我有两种型号django rest框架模型外键,django,django-models,django-rest-framework,Django,Django Models,Django Rest Framework,我有两种型号 class Order(models.Model): fields... class OrderItem(models.Model): fiels... order = models.ForeignKey(Order, related_name='items') 我有两个序列化程序: class CreateOrderItemSerializer(serializers.ModelSerializer): class Meta:
class Order(models.Model):
fields...
class OrderItem(models.Model):
fiels...
order = models.ForeignKey(Order, related_name='items')
我有两个序列化程序:
class CreateOrderItemSerializer(serializers.ModelSerializer):
class Meta:
model = OrderItem
resource_name = 'order-item'
fields = ('order', 'count')
.....
class OrderSerializer(serializers.ModelSerializer):
items = CreateOrderItemSerializer(many=True)
class Meta:
model = Order
resource_name = 'order'
fields = ('id','items')
我发布订单时使用了如下项目数组:
{
'ordername': 'foo',
'items': [{
'name': 'foo1',
},{
'name': 'foo2',
},
]
}
但我有一个错误:
"order":["This field is required."]
如何先创建订单,然后再使用此订单ID创建项目?我自己对问题的回答:
首先将额外的_kwargs添加到项目序列化程序:
class CreateOrderItemSerializer(serializers.ModelSerializer):
class Meta:
model = OrderItem
resource_name = 'order-item'
fields = ('order', 'count')
extra_kwargs = {
'order': {'required': False},
}
def create(self, validated_data):
items_data = validated_data.pop('items')
order = Order.objects.create(**validated_data)
for item in items_data:
item_name = item['name']
item, created = OrderItem.objects.get_or_create(order=order,name=item_name)
return order
将创建方法添加到orderserializer后:
class CreateOrderItemSerializer(serializers.ModelSerializer):
class Meta:
model = OrderItem
resource_name = 'order-item'
fields = ('order', 'count')
extra_kwargs = {
'order': {'required': False},
}
def create(self, validated_data):
items_data = validated_data.pop('items')
order = Order.objects.create(**validated_data)
for item in items_data:
item_name = item['name']
item, created = OrderItem.objects.get_or_create(order=order,name=item_name)
return order
我对这个问题的回答是:
首先将额外的_kwargs添加到项目序列化程序:
class CreateOrderItemSerializer(serializers.ModelSerializer):
class Meta:
model = OrderItem
resource_name = 'order-item'
fields = ('order', 'count')
extra_kwargs = {
'order': {'required': False},
}
def create(self, validated_data):
items_data = validated_data.pop('items')
order = Order.objects.create(**validated_data)
for item in items_data:
item_name = item['name']
item, created = OrderItem.objects.get_or_create(order=order,name=item_name)
return order
将创建方法添加到orderserializer后:
class CreateOrderItemSerializer(serializers.ModelSerializer):
class Meta:
model = OrderItem
resource_name = 'order-item'
fields = ('order', 'count')
extra_kwargs = {
'order': {'required': False},
}
def create(self, validated_data):
items_data = validated_data.pop('items')
order = Order.objects.create(**validated_data)
for item in items_data:
item_name = item['name']
item, created = OrderItem.objects.get_or_create(order=order,name=item_name)
return order
这里有一个很好的解决方案 这几乎是同样的问题 区别在于使用了
ForeignKey
而不是manytomy
,这将导致必填字段错误
添加extra_kwargs
解决了这个问题,还有一种方法是将null=True添加到foreignkey字段
order = models.ForeignKey(Order, related_name='items', null=True)
这里有一个很好的解决方案 这几乎是同样的问题 区别在于使用了
ForeignKey
而不是manytomy
,这将导致必填字段错误
添加extra_kwargs
解决了这个问题,还有一种方法是将null=True添加到foreignkey字段
order = models.ForeignKey(Order, related_name='items', null=True)
谢谢花了太长时间寻找这个解决方案。REST框架文档糟透了!谢谢花了太长时间寻找这个解决方案。REST框架文档糟透了!