Django остальные рамки, обновление объекта после создания - PullRequest
0 голосов
/ 27 марта 2020

У меня есть 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 файла, чтобы оно содержало постоянный шаблон и формат в конце поля mission_name.

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

Как этого достичь и где мне хранить такой код, views.py или serializers.py?

1 Ответ

1 голос
/ 27 марта 2020

Есть несколько способов, которыми это может быть достигнуто в зависимости от ваших требований.

  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. Если вы хотите установить его через просмотр / сериализатор, вы можете установить его в методе 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)
    

Вы также можете переопределить некоторые методы в вашем наборе, например execute_create или создать

...