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