Django Rest Framework序列化在发布请求时失败

时间:2016-07-05 13:36:24

标签: django serialization django-rest-framework

我有一个seializer类

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

但是我需要在客户端app的post请求中使用它来在数据库中创建新对象,所以它显然不会工作。我读到我需要编写.create()方法来处理这种情况,但我真的不明白它是如何工作的以及我需要覆盖的东西,所以如果有人能够解释它应该如何以及为什么我真的很感激。 / p>

也为模型附加代码:

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())

2 个答案:

答案 0 :(得分:1)

您正在寻找SlugRelatedField

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

答案 1 :(得分:0)

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

class StudentJournalSerializer(serializers.ModelSerializer):

    class Meta:
        model = StudentJournalModel
        depth = 1

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

这也可以用于获取嵌套资源,对于POST,您需要发送相关字段的ID,它应该足以创建新对象。学生,纪律和para_number应该已经存在于数据库中,如果还应该创建其中任何一个,那么你需要自己编写.create()方法,请看docs

中这个很好的小例子