我有一个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())
答案 0 :(得分:1)
您正在寻找SlugRelatedField。
请注意,您需要确保slug字段具有唯一约束。
答案 1 :(得分:0)
如果您想公开模型的所有字段,只需说:
class StudentJournalSerializer(serializers.ModelSerializer):
class Meta:
model = StudentJournalModel
depth = 1
来自docs:深度选项应设置为一个整数值,表示在恢复为平面表示之前应该遍历的关系深度。
这也可以用于获取嵌套资源,对于POST,您需要发送相关字段的ID,它应该足以创建新对象。学生,纪律和para_number应该已经存在于数据库中,如果还应该创建其中任何一个,那么你需要自己编写.create()方法,请看docs
中这个很好的小例子