简体   繁体   English

Django rest框架,创建后更新对象

[英]Django rest framework, update object after creation

I have a DRF API that takes in the following model:我有一个采用以下模型的 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'

And it's serializer:它是序列化程序:

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'
        )

And the view:和观点:

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)

I want to update the URL field of the file to contain a constant pattern and format in the end the mission_name field.我想更新文件的 URL 字段,以在 Mission_name 字段的末尾包含一个常量模式和格式。

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

How can that be achieved and where should I store such code, the views.py or serializers.py?如何实现,我应该在哪里存储这样的代码,views.py 或 serializers.py?

There are several ways this could be achieved based on your requirements.根据您的要求,有多种方法可以实现这一点。

  1. If you want to set the url upon creation even if it is not through the api, you can do it in the save method of the model itself:如果你想在创建时设置 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. If you want to set it through the view/serializer, you can set it in the create method of your 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)

You can also override some methods in your viewset like perform_create or create您还可以覆盖视图集中的某些方法,例如perform_create 或 create

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM