获取相关字段的id并保存数据



我对DRF有点陌生,我正在建立一个考勤数据库。我想在我的Attendance中保存AttendanceSlot的实例,但我不知道如何获得id,所以我可以保存它…models.py

class AttendanceSlot(models.Model):
department_id = models.ForeignKey("students.Department", verbose_name=_("department id"), on_delete=models.CASCADE)
course_id = models.ForeignKey("students.Course", verbose_name=_("course id"), related_name= 'course', on_delete=models.CASCADE)
lecturer_id = models.ForeignKey("lecturers.Lecturer", on_delete=models.CASCADE)
date = models.DateField(_("attendance date"), auto_now=False, auto_now_add=True)
start_time = models.TimeField(_("start time"), auto_now=False, auto_now_add=False)
end_time = models.TimeField(auto_now=False, auto_now_add=False)
longitude = models.CharField(_("longitude"), max_length=50)
latitude = models.CharField(_("latitude"), max_length=50)
radius = models.CharField(_("radius"), max_length=50)
def __str__(self):
return '{0}'.format(self.course_id.course_code)
class Attendance(models.Model):
slot_id = models.ForeignKey("attendance.AttendanceSlot", verbose_name=_("attendance slot"), on_delete=models.CASCADE)
student_id = models.ForeignKey("students.Student", on_delete=models.CASCADE)
performance = models.CharField(max_length=50)

serializers.py

class AttendanceSerializer(serializers.ModelSerializer):
# student_id = serializers.SlugField(read_only=True)
slot_id = serializers.PrimaryKeyRelatedField(queryset=AttendanceSlot.objects.all(), many=False)
class Meta:
model = Attendance
fields = ['student_id', 'slot_id', 'performance']

views.py

class Attendance(ListCreateAPIView):
queryset = Attendance.objects.all()
serializer_class = AttendanceSerializer
def get_queryset(self, *args, **kwargs):

id = self.kwargs['pk']
slot = AttendanceSlot.objects.get(id=id)
return slot
def perform_create(self, serializer):
serializer.save(user = self.request.user, slot_id=self.get_queryset())
return super().perform_create(serializer)

urls . py

path('<int:pk>/', views.Attendance.as_view(), name='attendance'),

似乎您没有从请求中接收slot_id,而是从数据库中获取它。因此,您甚至不需要在序列化器中指定slot_id。将views.pyserializers.py文件修改如下

# views.py
class Attendance(ListCreateAPIView):
queryset = Attendance.objects.all()
serializer_class = AttendanceSerializer

# serializers.py
class AttendanceSerializer(serializers.ModelSerializer):
class Meta:
model = Attendance
fields = ['student_id',  'performance']
def create(self, validated_data):
slot_id = self.context['view'].kwargs['pk']
slot = AttendanceSlot.objects.get(id=slot_id)
return Attendance.objects.create(slot=slot, **validated_data)

注意:上面的序列化程序期望您在POST请求的主体中传递student_idperformance

最新更新