【问题标题】:Django rest framework, difficulty understanding foreign Key field serializationdjango rest框架,外键字段序列化理解困难
【发布时间】: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']

现在,我正在尝试访问序列化数据,因此我可以在其上运行我的逻辑并在视图中返回响应。

框架的文档在这个主题中有点跳入深水(至少对我而言)

所以,我有两个问题:

  1. 如何访问序列化器中的序列化数据?
  2. 我在哪里可以运行我的业务逻辑,它返回一个 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


    【解决方案1】:

    您可以使用serializer.data 来获取序列化的json:

    >>> serialized_data = LocationSerializer(data,many=False)
    >>> print(serialized_data)
    LocationSerializer(<Location: yovel,Point object (1)>):
    >>> serailizer.data
    

    要在序列化程序级别执行逻辑,您可以使用SerializerMethodfield

    【讨论】:

      猜你喜欢
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 2021-04-08
      相关资源
      最近更新 更多