django - (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))
]
解决方案
所以我决定通过以下手动方式进行操作:
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
推荐阅读
- python - 在 Eve 的 pre-put 回调中从数据库中获取项目的信息
- angular - TS2345:“RolesGuard”类型的参数不可分配给“CanActivate”类型的参数
- autosar - adaptive AUTOSAR - difference between function group and application?
- package - Installing Racket Packages without installing Dr Racket
- elasticsearch - 如何使用映射将符号映射到弹性搜索中的单词?
- sql - Oracle 嵌套表约束
- outlook - 64 位应用程序中的 .msg 预览不起作用
- c# - 如果存在,如何删除最后一个字符串元素不必要的文本?
- vb.net - 需要 STMP 身份验证
- javascript - 流检查错误:fjs.parentNode.insertBefore