【问题标题】:Django rest framework, update object after creationDjango rest框架,创建后更新对象
【发布时间】:2020-03-27 03:57:05
【问题描述】:

我有一个采用以下模型的 DRF API:


class Points(models.Model):
    mission_name = models.CharField(name='MissionName',
                                    unique=True,
                                    max_length=255,
                                    blank=False,
                                    help_text="Enter the mission's name"
                                    )
    # Some irrlevant feid

    url = models.URLField(help_text='Leave Empty!', default=" ")

    date_added = models.DateTimeField(default=timezone.now)

    class Meta:
        get_latest_by = 'date_added'

它是序列化器:

from rest_framework.serializers import HyperlinkedModelSerializer

from .models import Points


class PointsSerializer(HyperlinkedModelSerializer):

    class Meta:
        model = Points
        fields = (
            'id', 'MissionName', 'GDT1Latitude', 'GDT1Longitude',
            'UavLatitude', 'UavLongitude', 'UavElevation', 'Area',
            'url', 'date_added'
        )

还有观点:

class PointsViewSet(ModelViewSet):
    # Return all order by id, reversed.
    queryset = Points.objects.all().order_by('-id')
    serializer_class = PointsSerializer
    data = queryset[0]
    serialized_data = PointsSerializer(data, many=False)
    points = list(serialized_data.data.values())

    def retrieve(self, request, *args, **kwargs):
        print(self.data)
        mission_name = self.points[1]

        assign_gdt = GeoPoint(lat=self.points[2], long=self.points[3])
        gdt1 = [assign_gdt.get_lat(), assign_gdt.get_long()]

        assign_uav = GeoPoint(lat=self.points[4], long=self.points[5], elevation=self.points[6])
        uav = [assign_uav.get_lat(), assign_uav.get_long(), assign_uav.get_elevation()]

        area_name = f"'{self.points[-2]}'"

        main = MainApp.run(gdt1=gdt1, uav=uav, mission_name=mission_name, area=area_name)
        print('file created')
        return render(request, main)

我想更新文件的 URL 字段,使其在任务名称字段末尾包含一个常量模式和格式。

object.url = f'127.0.0.1/twosecondgdt/{mission_name}'

如何实现,我应该在哪里存储这些代码,views.py 或 serializers.py?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    根据您的要求,有几种方法可以实现。

    1. 如果你想在创建时设置url,即使不是通过api,也可以在模型本身的save方法中进行:

      class Points(models.Model):
          # fields here
      
          def save(self, **args, **kwargs):
              if not self.url.strip():
                  # You may want to store the value of `127...` in an environment variable
                  self.url = f"127.0.0.1/twosecondgdt/{self.mission_name}"
              super().save(*args, **kwargs)
      
    2. 如果你想通过view/serializer来设置,可以在你的serializer的create方法中设置:

      class PointsSerializer(HyperlinkedModelSerializer):
      
          def create(self, validated_data):
              mission_name = validated_data["mission_name"]
              validated_data["url"] = f"127.0.0.1/twosecondgdt/{mission_name}"
              return super().create(validated_data)
      

    您还可以覆盖视图集中的某些方法,例如 perform_create or create

    【讨论】:

      猜你喜欢
      • 2014-07-07
      • 2016-04-23
      • 1970-01-01
      • 2018-09-02
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      相关资源
      最近更新 更多