0

I have a DRF API that takes in the following model:


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.

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?

1 Answer 1

1

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:

    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:

    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

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.