如何使用序列化程序使用外键创建新对象

时间:2015-05-25 11:50:18

标签: django django-rest-framework

假设这个模型:

class Tweek(models.Model):
    content = models.CharField(max_length=140)
    date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(User, related_name='author')

    class Meta:
        ordering = ['-date']

    def __unicode__(self):
        return self.content

Everthing工作正常,现在我尝试绑定一个休息api uppon。我已经安装了django rest框架,我可以检索tweek但我无法创建新的。

我有Tweek模型的序列化器:

class TweekSerializer(serializers.ModelSerializer):
    author = UserSerializer()

    class Meta:
        model = Tweek
        fields = ('content', 'date', 'author')

    def create(self, validated_data):
        author_data = validated_data.pop('author')
        author = User.objects.get(username=author_data)

        return Tweek.objects.create(author=author, **validated_data)

并且用户序列化器看起来像:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name')

但是帖子返回

{
    "author": {
        "username": [
            "This field must be unique."
        ]
    }
}

我已经按照文档进行了操作,但我对这个案例感到迷茫:( 有什么想法吗?

1 个答案:

答案 0 :(得分:1)

此处的问题是,Django unique=True模型上User设置like the username field的任何字段都会自动the UniqueValidator added到序列化程序字段。此验证程序正在触发您看到的消息,您可以在初始化字段时将validators设置为[](空列表)来删除验证。

您要遇到的另一个问题是您正在尝试使用外键创建对象,但是您将在响应中返回完整的序列化对象。通过使用第二个字段来设置id,即只写,并使用原始序列化器字段用于嵌套表示并使其成为只读,可以更容易地解决此问题。

您可以在以下Stack Overflow问题中找到更多信息:DRF: Simple foreign key assignment with nested serializers?