假设这个模型:
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."
]
}
}
我已经按照文档进行了操作,但我对这个案例感到迷茫:( 有什么想法吗?
答案 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?