【发布时间】:2020-09-17 09:52:15
【问题描述】:
我正在使用 drf 嵌套路由器。参数和位置通过_location外键连接。在 Parameter 中,我想添加一个指向其 Location 的 Location 字段。我认为我需要的是反向 url 链接?我怎样才能做到这一点?
型号
class Location(models.Model):
name = models.CharField(max_length=25, unique=True)
description = models.CharField(max_length=64, blank=True)
longitude = models.FloatField(blank=True, null=True)
latitude = models.FloatField(blank=True, null=True)
class Meta:
verbose_name_plural = 'locations'
def __str__(self):
return self.name
class Parameter(models.Model):
name = models.CharField(max_length=25)
unit = models.CharField(max_length=10, blank=True)
values = models.JSONField(default=list, blank=True)
_location = models.ForeignKey(Location,
on_delete=models.CASCADE,
related_name="parameters"
)
def __str__(self):
return self.name
序列化器
class ParameterSerializer(serializers.ModelSerializer):
aggregation = serializers.SerializerMethodField()
#I want to add the location url here
location =
class Meta:
model = Parameter
fields = ('id', 'name', 'unit', 'aggregation', 'location', 'values')
def get_aggregation(self, obj):
return aggregate(obj.values)
def create(self, obj):
return add_parameter(obj)
class LocationSerializer(serializers.ModelSerializer):
parameters = serializers.HyperlinkedIdentityField(view_name='weather:location-parameters-list', lookup_url_kwarg='location_pk')
aggregation = serializers.JSONField(default=dict, source="parameters.aggregation", allow_null=True)
class Meta:
model = Location
fields = ('id','name', 'description','longitude', 'latitude', 'aggregation', 'parameters')
def create(self, obj):
return add_location(obj)
urls.py
app_name = "weather"
router = routers.SimpleRouter()
router.register('locations', LocationViewSet)
locations_router = routers.NestedSimpleRouter(router, 'locations', lookup='location')
locations_router.register('parameters', ParameterViewSet, basename='location-parameters')
urlpatterns = [
path("", include(router.urls)),
path("", include(locations_router.urls))
]
【问题讨论】:
-
你看过github.com/alanjds/…吗?
-
是的,我做到了。它可以帮助我处理我的位置参数字段,因为您可以看到我在那里使用了 HyperlinkedIdentityField。但是对于 Parameter,它是不同的,因为我想要后向关系。
标签: django rest django-rest-framework