【问题标题】:Django Rest Framework serialization fails on post requestsDjango Rest Framework 序列化在发布请求时失败
【发布时间】:2016-07-05 13:36:23
【问题描述】:

我有一个序列化器类

class StudentJournalSerializer(serializers.ModelSerializer):

    class Meta:
        model = StudentJournalModel
        fields = (
            'value',
            'date',
            'discipline',
            'para_number',
            'student',
            'is_module'
        )

我无法按照我的需要去工作。 我希望它显示的不是 ForeignKey 字段的 pk 值,而是实际字段值加上这个类也应该适用于 post 方法。

我通常会添加:

student = serializers.CharField(
    source='student.username'
)
discipline = serializers.CharField(
    source='discipline.discipline'
)
para_number = serializers.CharField(
    source='para_number.para_position'
)

但它只适用于 GET read_only=True

但是我需要在来自客户端应用程序的发布请求期间使用它来在数据库中创建新对象,所以它显然不会工作。我读到我需要编写 .create() 方法来处理这种情况,但我真的不明白它是如何工作的以及我需要在那里覆盖什么,所以如果有人能解释它应该如何以及为什么我将不胜感激。

也为模型附加代码:

class StudentJournalModel(models.Model):

    value = models.CharField(
        max_length=55,
        blank=True,
        null=True,
        verbose_name="Value",
        default=''
    )
    date = models.DateField(
        verbose_name="Date"
    )
    discipline = models.ForeignKey(
        'department.Disciplines',
        verbose_name="Discipline"
    )
    para_number = models.ForeignKey(
        'department.ParaTime',
        verbose_name="Class #"
    )
    student = models.ForeignKey(
        User,
        verbose_name="Student"
    )
    is_module = models.BooleanField(
        verbose_name="Module value"
    )

    def __unicode__(self):
        return u"%s, %s, %s" % (self.date, self.discipline, self.student.get_full_name())

【问题讨论】:

    标签: django serialization django-rest-framework


    【解决方案1】:

    您正在寻找SlugRelatedField

    请注意,您需要确保 slug 字段具有唯一约束。

    【讨论】:

    • 在我的情况下查询集等于多少?
    • 除非你需要设置一些限制,否则它将是 .objects.all()
    • 我想我明白了。谢谢
    【解决方案2】:

    如果您想公开模型的所有字段,只需说:

    class StudentJournalSerializer(serializers.ModelSerializer):
    
        class Meta:
            model = StudentJournalModel
            depth = 1
    

    来自文档:深度选项应设置为整数值,指示在恢复为平面表示之前应遍历的关系深度。

    这也适用于获取嵌套资源,对于 POST,您需要发送相关字段的 id,它应该足以创建新对象。学生、学科和 para_number 应该已经存在于数据库中,如果还应该创建它们中的任何一个,那么您需要自己编写 .create() 方法,请参阅docs 中的这个不错的小示例

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 2016-05-31
      • 1970-01-01
      • 2020-03-12
      • 2017-01-10
      • 2017-11-18
      • 2020-05-23
      • 2015-08-08
      • 2020-02-01
      相关资源
      最近更新 更多