我有两个模型学生和标记,我有需要在嵌套序列化器类中使用邮递员添加标记的学生列表。我如何选择已经存在的学生?
模型.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__'
如果我提供字典,我正在创建新学生,我不想创建,我想选择现有学生,我该怎么做?
当你有嵌套的序列化器类时,如何通过邮递员发送数据?
如果您希望在添加标记时选择现有学生而不是创建新学生,您可以考虑从 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 选择现有学生。