【问题标题】:Django - Foreingkey relationship requires fieldDjango - 外键关系需要字段
【发布时间】:2019-10-26 02:53:48
【问题描述】:

我在两个模型之间有如下外键关系:

class Text(models.Model):
    textcontent = models.CharField(max_length=100)


class Comment(models.Model):
    text = models.ForeignKey(ModelA,
                               on_delete=models.CASCADE,
                               null=True,
                               blank=True)
    commentContent = models.CharField(max_length=100)

所以,一个文本可以有多个 cmets,但一个注释只能分配给一个文本。 在serializers.py 我有以下内容:

class TextSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Text
        fields = ('url',
                  'id',
                  'comment_set'
                  )

如您所见,我还想通过'comment_set' 显示属于一个文本的一组 cmets。 但是当我创建一个文本实例(不提供 cmets)时,我在命令行上得到以下信息:

“comment_set”:[ “这是必填栏。” ],

为什么需要它?我已将空白和空参数设置为 True。 我该如何解决这个问题?

【问题讨论】:

    标签: django serialization model deserialization


    【解决方案1】:

    可以在元类中设置read_only_fields--[DRF-Doc],为

    class TextSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = Text
            fields = ('url', 'id', 'comment_set')
            read_only_fields = ('comment_set',)

    【讨论】:

    • 当我这样做时,我可以稍后将 Comment 实例添加到创建的 Text 实例中吗?
    • comment_set是一个反向关系,你不能通过TextSerializer创建Comment实例除非你覆盖 create() 方法。
    • 这意味着,即使没有引发错误,您也无法使用 TextSerializer 创建 Comment 实例。
    • 是的,但我的意思是:当我稍后通过 CommentSerializer 创建一个 Comment 实例时,我可以将它与 Text 实例相关联,对吧?这个字段是只读的,不会影响添加过程吧?
    • 是的。此只读不会影响添加过程除非您尝试将数据放在同一字段中,这里是comment_set。您可以使用新字段 comment 添加新数据。
    猜你喜欢
    • 2018-02-24
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2013-07-20
    • 2020-01-02
    相关资源
    最近更新 更多