Django添加PrimaryKeyRelatedField列表

时间:2016-10-30 16:21:25

标签: django rest primary-key

我有两个班级

class Drink(models.Model):
    name = models.CharField(max_length=100, blank=False, default='')
    brand = models.TextField()
    percentage = models.IntegerField()

class Drinking(models.Model):
    amount = models.IntegerField(blank=False)
    drinks = models.ForeignKey(Drink, related_name='drinks',blank = True,null=True)

并希望通过REST POST向Drink模型添加饮品列表。

在序列化程序中,我有以下内容:

class DrinkingSerializer(serializers.ModelSerializer):
    drinks = serializers.PrimaryKeyRelatedField(many=True, read_only=False ,queryset=Drink.objects.all())

class Meta:
    model = Drinking
    fields = ('pk','drinks','amount')

def create(self, validated_data):
    return Drinking.objects.create(**validated_data)

def update(self, instance, validated_data):
    instance.amount = validated_data.get('amount', instance.amount)    
    instance.save()
    return instance      

当我尝试发布饮酒对象时:

{
    "drinks": [2],
    "amount": 5
}

我得到错误,Drinkings.drinks必须是Drink实例。我的猜测是我必须更改查询集才能获得饮料的主键,但我不知道如何。

更新 我在逻辑方面做了一些小改动,所以每个饮酒课只能喝一杯和一杯。现在使用以下Serializer:

class DrinkingSerializer(serializers.ModelSerializer):
    drink = serializers.PrimaryKeyRelatedField(many=False, read_only=False, queryset=Drink.objects.all())

2 个答案:

答案 0 :(得分:0)

您确定ID为2的Drink对象存在吗?

另外,尝试不带括号的请求:"drinks": 2 - 在我的DRF Api中不需要任何其他内容。

答案 1 :(得分:0)

我认为您饮酒模型中的野外饮品应该是饮品模型。

class Drinking(models.Model):
    amount = models.IntegerField(blank=False)


class Drink(models.Model):
    name = models.CharField(max_length=100, blank=False, default='')
    brand = models.TextField()
    percentage = models.IntegerField()
    drinks = models.ForeignKey(Drinking, related_name='drinks',blank = True,null=True)

然后,使用这些模型,您的序列化程序应如下所示:

class DrinkingSerializer(serializers.ModelSerializer):
    drinks = serializers.PrimaryKeyRelatedField(many=True, read_only=False ,queryset=Drink.objects.all())

class Meta:
    model = Drinking
    fields = ('pk','drinks','amount')

我希望这会有所帮助。