【发布时间】:2020-04-05 18:41:24
【问题描述】:
我正在尝试学习 Django REST 框架中的关系以及序列化程序的工作。
我有以下型号:
from django.db import models
class Point(models.Model):
Latitude = models.FloatField(verbose_name="Latitude",
blank=False)
Longitude = models.FloatField(verbose_name="Longitude",
blank=False)
elevation = models.FloatField(verbose_name='Location Elevation',
blank=False,
default=1)
class Location(models.Model):
location_name = models.TextField(unique=True, blank=False, verbose_name="Location Name")
location_coordinates = models.ForeignKey(Point,
on_delete=models.CASCADE,
verbose_name='Latitude & Longitude')
class Meta:
unique_together = ['location_name', 'location_coordinates']
get_latest_by = 'date_added'
def __str__(self):
return f'{self.location_name},{self.location_coordinates}'
而且,这个序列化器:
from rest_framework import serializers
from .models import Location
class LocationSerializer(serializers.ModelSerializer):
location_name = serializers.RelatedField(many=True, read_only=True)
def to_representation(self, instance):
representation = super().to_representation(instance)
print(representation)
return representation
class Meta:
model = Location
fields = ['location_name']
现在,我正在尝试访问序列化数据,因此我可以在其上运行我的逻辑并在视图中返回响应。
框架的文档在这个主题中有点跳入深水(至少对我而言)
所以,我有两个问题:
- 如何访问序列化器中的序列化数据?
- 我在哪里可以运行我的业务逻辑,它返回一个 folium 渲染的 HTML 文件,我更喜欢在序列化程序中而不是在视图中执行它,所以它可以在发布请求时返回,而不是在某种形式retrieve 方法,这意味着在序列化程序中创建一个可以返回给用户的新字段。
编辑:
我把我的序列化器改成这样:
class PointSerializer(serializers.ModelSerializer):
class Meta:
model = Point
field = '__all__'
class LocationSerializer(serializers.ModelSerializer):
# mission_file = serializers.PrimaryKeyRelatedField(many=True,read_only=True)
class Meta:
model = Location
fields = ['location_name', 'location_coordinates']
访问数据如下:
In [4]: queryset = Location.objects.all()
In [5]: data = queryset[2]
In [6]: location = LocationSerializer(data)
In [7]: location_data_f = location.data.items()
In [8]: print(location_data_f)
odict_items([('location_name', 'created'), ('location_coordinates', 3)])
In [9]: data = queryset[3]
In [10]: location = LocationSerializer(data)
In [11]: location_data_f = location.data.items()
In [12]: print(location_data_f)
odict_items([('location_name', 'newday'), ('location_coordinates', 4)])
如何访问 location_coordinates 上的数据,而不是 id。
【问题讨论】:
标签: python django django-rest-framework