首页 > 解决方案 > (Django Rest Framework) 如何添加反向 URL 字段?

问题描述

我正在使用 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)

网址.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))
]

标签: djangorestdjango-rest-framework

解决方案


所以我决定通过以下手动方式进行操作:

 request = self.context['request']
 return request.build_absolute_uri(reverse('weather:location-detail', 
                                                    args=[obj._location.id]))

对于像我这样有问题的人。最初我不知道如何在模型中传递上下文,因为我使用了 ModelViewSet。你可以这样做,然后调用self.context['request']你的序列化程序

    def get_serializer_context(self):
        context = super(ParameterViewSet, self).get_serializer_context()
        context.update({"request": self.request})
        return context

推荐阅读