如何仅更新Drf中的字段

时间:2019-08-05 19:28:48

标签: python django django-rest-framework

我正在尝试更新模型的字段,为此我尝试使用补丁,但是我对django rest还是陌生的,我认为我遇到了问题

我尝试使用partial_update方法,但是不起作用。我想要取消的更新状态(取消显示在我的enums.py中)

这是我模型的一部分

class Aula(AcademicoBaseModel, permissions.AulaPermission):
    turma_disciplina = models.ForeignKey(TurmaDisciplina, models.PROTECT, related_name='lessons')
    data_inicio = models.DateTimeField(db_index=True)
    data_termino = models.DateTimeField()
    duracao = models.IntegerField(default=50)
    status = models.ForeignKey('Status', models.PROTECT, default=1)

这是我的观点

class CancelLessonView(generics.UpdateAPIView):
    serializer_class = serializers.AulaSerializer

    def patch(self, request, *args, **kwargs):
        lesson = self.kwargs.get('id')
        instance = models.Aula.objects.get(id=lesson)
        instance.status_id = enums.StatusEnum.CANCELLED

        serializer = serializers.AulaSerializer(data=request.data, partial=True)
        serializer.is_valid(raise_exception=True)
        instance.save()


        return Response(serializer.data)

这是我的模特状态

class Status(models.Model):
    name = models.CharField(max_length=50, db_column='nome')
    color = models.CharField(max_length=7, db_column='cor')
    ignore_in_attendance_report = models.BooleanField(default=False)
    allow_attendances = models.BooleanField(default=True)
    allow_activities = models.BooleanField(default=True)

我的enums.py

class StatusEnum:
    NOT_SENT = 1
    PENDING = 2
    SENT = 3
    CONTENT_PENDING = 4
    CANCELLED = 5

1 个答案:

答案 0 :(得分:0)

首先,我建议始终使用英文名称-对于其他程序员来说,理解您的代码会容易得多。

关于状态,如果您想要真正简单的解决方案,我建议将状态更改为简单的布尔字段,并且可以使用instance.status = False或True。

为什么要使用ForeignKey进行身份验证?状态模型的外观如何?

编辑

我的做法是在我创建服务的每个django应用程序中添加services.py文件,在您的示例中,我们说AulaService。在此类中,您可以定义方法:

# lesson == Aula
update_lesson_status(self, lesson_id, status_id):
  Aula.objects.filter(id=lesson_id).update(status_id=status_id)

,您可以在任何地方使用服务(但首先要记住要导入服务), 在您的示例中,您可以在视图中调用服务:

class CancelLessonView(generics.UpdateAPIView):
    serializer_class = serializers.AulaSerializer

    def patch(self, request, *args, **kwargs):
        lesson = self.kwargs.get('id')
        AulaService().update_lesson_status(lesson_id=lesson,
                                  status_id=enums.StatusEnum.CANCELLED

干杯, 芬里尔