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框架文档糟透了!