Django rest framework, имитировать поведение Django admin при использовании внешнего ключа - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть Django модель API остального фреймворка, которая содержит поле внешнего ключа.

Я хочу показать пользователю В просматриваемом API своего рода выпадающее меню для выбора существующих объектов или создания нового, как в интерфейсе администратора, существует ли что-то подобное этому?

Модели:

class Mission(models.Model):
    id = models.UUIDField(primary_key=False, default=uuid.uuid4, editable=False)

    mission_name = models.CharField(name='MissionName',
                                    verbose_name="Mission Name",
                                    unique=True,
                                    max_length=255,
                                    blank=False,
                                    help_text="Enter the mission's name",
                                    primary_key=True
                                    )

    uav_lat = models.FloatField(name="UavLatitude",
                                verbose_name="UAV Latitude",
                                unique=False, max_length=255, blank=False,
                                help_text="Enter the location's Latitude, first when extracting from Google Maps.",
                                default=DEFAULT_VALUE)
    uav_lon = models.FloatField(name="UavLongitude",
                                verbose_name="UAV Longitude",
                                unique=False, max_length=255, blank=False,
                                help_text="Enter the location's Latitude, first when extracting from Google Maps.",
                                default=DEFAULT_VALUE)

    uav_elevation = models.FloatField(name="UavElevation",
                                      verbose_name="UAV Elevation",
                                      max_length=100, default=1,
                                      blank=False,
                                      help_text="Enter the above ~Sea Level~ planned uav Elevation. "
                                      )

    area = models.CharField(
        name='Area',
        max_length=8,
        choices=AREAS,
    )

    date_added = models.DateTimeField(verbose_name="Date Added", default=now())

    gdt = models.ForeignKey(KnownLocation, on_delete=models.PROTECT)

    class Meta:
        get_latest_by = 'date_added'

Модель KnownLocation:

class KnownLocation(models.Model):
    name = models.CharField(name="Name",
                            unique=False,
                            primary_key=True,
                            max_length=150,
                            blank=False,
                            help_text="Enter the name of the location's name")

    area = models.CharField(name='Area',
                            max_length=8,
                            choices=AREAS, )

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

    latitude = models.FloatField(name="Latitude",
                                 unique=True, max_length=255, blank=False,
                                 help_text="Enter the location's Latitude, first when extracting from Google Maps.",
                                 default=DEFAULT_VALUE)

    longitude = models.FloatField(name="Longitude",
                                  unique=True, max_length=255, blank=False,
                                  help_text="Enter the location's Longitude, second when extracting from Google Maps.",
                                  default=DEFAULT_VALUE)

    elevation = models.FloatField(name="Elevation",
                                  help_text="Enter the location's ~Sea Level~ elevation, or Leave empty for auto-fill. ",
                                  blank=True,
                                  null=True
                                  )

Мои сериализаторы:

class KnownLocationSerializer(HyperlinkedModelSerializer):

    def create(self, validated_data):
        """
        Checks if user inputted the elevation or left it None.
        If value is None, it will be changed to the value fetched from Google's elevation API.
        """

        if not validated_data["Elevation"]:
            elevation = get_elevation(validated_data["Latitude"], validated_data["Longitude"])
            validated_data["Elevation"] = round(elevation, 3)
            return super().create(validated_data)

    date_added = DateTimeField(format="%d-%m-%Y", required=False, read_only=True)

    class Meta:
        model = KnownLocation
        fields = ('Name', 'Area', 'Latitude', 'Longitude', 'Elevation', 'date_added')

class MissionSerializer(ModelSerializer):
    gdt = KnownLocationSerializer(many=False, read_only=False)

    class Meta:
        model = Mission
        fields = ('id', 'MissionName', 'UavLatitude', 'UavLongitude', 'UavElevation', 'Area', 'gdt')

Поведение администратора, которое я хотел бы подражать в API с возможностью просмотра. Admin example

...