在嵌套序列化器时尝试使用邮递员添加数据

问题描述 投票:0回答:1

我有两个模型学生和标记,我有需要在嵌套序列化器类中使用邮递员添加标记的学生列表。我如何选择已经存在的学生?

模型.py

class Student(models.Model):
    name = models.CharField(max_length=50, null=False, blank=False)
    roll_no = models.CharField(max_length=5, null=False, blank=False)
    mobile_no = PhoneNumberField(null=False, blank=False, unique=True)
    mail_id = models.EmailField(null=False, blank=False)

    def __str__(self):
        return self.name

class Marks(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    maths = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(100)])
    science = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(100)])
    social = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(100)])

    def __str__(self):
        return str(self.student)

序列化器.py

class StudentSerializer(serializers.ModelSerializer):

    class Meta:
        model = Student
        fields = '__all__'

class MarksSerializer(serializers.ModelSerializer):

    student = StudentSerializer()
    class Meta:
        model = Marks
        fields = '__all__'

如果我提供字典,我正在创建新学生,我不想创建,我想选择现有学生,我该怎么做?

当你有嵌套的序列化器类时,如何通过邮递员发送数据?

python django django-models postman django-serializer
1个回答
0
投票

如果您希望在添加标记时选择现有学生而不是创建新学生,您可以考虑从 MarksSerializer 中删除 StudentSerializer。您可以使用 PrimaryKeyRelatedField,它允许您使用 Student 模型的主键来表示关系。这样,您在使用 Postman 创建标记时只需发送学生的主键(或 id)即可。

序列化器.py

从rest_framework导入序列化器从.models导入Student, 标记

StudentSerializer 类(serializers.ModelSerializer):

class Meta:
    model = Student
    fields = '__all__'

类 MarksSerializer(serializers.ModelSerializer):

student = serializers.PrimaryKeyRelatedField(queryset=Student.objects.all())
class Meta:
    model = Marks
    fields = '__all__'

通过Postman发送数据:

通过Postman发送数据:

选择 HTTP 方法为 POST。 输入您尝试访问的 API 端点的 URL。 转到 Body 选项卡,选择 raw 和 JSON (application/json)。 按以下格式发送数据:

{
    "student": 1, 
    "maths": 95,
    "science": 89,
    "social": 92
}

这里的student是现有学生的ID。数学、科学和社交领域是要为该学生添加的分数。

如果您已正确设置所有内容,这应该可以工作,并且不会创建新学生,而是通过 ID 选择现有学生。

© www.soinside.com 2019 - 2024. All rights reserved.