【问题标题】:How to use serializer to create a new object with a foreignkey如何使用序列化程序创建具有外键的新对象
【发布时间】:2015-08-06 21:31:28
【问题描述】:

假设这个模型:

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

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

我有这个用于 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."
        ]
    }
}

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    这里的问题是任何设置了unique=True 的字段,在Django User 模型上的like the username field,将自动将the UniqueValidator added 设置为序列化器字段。这个验证器是触发您看到的消息的原因,您可以在初始化字段时通过将validators 设置为[](一个空列表)来删除验证。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2015-08-15
      相关资源
      最近更新 更多