Django работа с остальными фреймами вложенного сериализатора не обновляет объект - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть модель с полем внешнего ключа, и после сериализации объекта я выполняю для него метод create, который обновляет поле, если оно отсутствует.

Во втором сериализаторе я перезаписал метод обновления, чтобы убедиться, что данные были вставлены.

Я не получаю никаких ошибок при запуске обновления, но поле не обновляется.

модели:

class Mission(models.Model):
    # Some other irrelevant fields.

    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 KnownLocation(models.Model):
    """
    Add known location to map, But also use this as Base Object to describe locations as GDTs.
    :rtype Django base model for GeoLocation.
    """
    name = models.CharField(name="Name",
                            unique=False,
                            primary_key=True,
                            max_length=150,
                            blank=False,
                            help_text="Enter 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,
                                  verbose_name="Elevation"
                                  )

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

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)
            print(validated_data['elevation'])
            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)
    owner = HiddenField(default=CurrentUserDefault())

    def update(self, instance, validated_data):
        gdt_data = instance.gdt

        if not gdt_data.elevation:
            gdt_data.elevation = get_elevation(gdt_data.Latitude, gdt_data.Longitude)
            instance.save()
            print(gdt_data.elevation)
            return instance

    def create(self, validated_data):
        raise NotImplementedError

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

код оболочки:

>>> queryset = Mission.objects.all()
>>> data =queryset[0]
>>> mission = MissionSerializer(data)
>>> serializer = MissionSerializer()
>>> serializer.update(mission.instance,mission.data.values())
1. try:
1. try:
1126.715698242188
<Mission: Mission object (test1)>
>>> print(mission.data.values())
odict_values(['test1', 33.119654, 36.110092, 1300.0, '210', OrderedDict([('Name', '105'), ('Area', '210'), ('Latitude', 33.220439), ('Longitude', 35.808097), ('elevation', None), ('date_added', '07-04-2020')])])

Как видите, поле высот не обновляется, 1.try: является несвязанной печатью из функции декоратора в get_elevation.

1126.715 ... является напечатанным возвышением

...