我遇到了Django Rest Framework反向函数(来自rest_framework.reverse import reverse)和django_reverse的问题。
当我尝试返回单个对象的url时,我得到了所有的url模式,而不是ID,我获得了模型的文本表示。
例如我有一个名为Driver的模型,当我尝试获取pk = 1的Driver实例的url时,响应是
http:// base_url / driver / driver%20object /。
这可以通过重写Driver unicode 函数来返回str(self.pk)来解决,但我不喜欢这种方法。
此前版本的django / drf也没有出现此问题。
首先,我的虚拟环境是:
模型
class Dominio(AuditableModel):
dominio = models.CharField(max_length=200, blank=False, null=False, unique=True)
pais = models.ForeignKey(Pais, null=False, blank=False)
@property
def owners(self):
if self.conductores.count() > 0:
return self.conductores.filter(is_owner=True).all()[0]
else:
return None
class Conductor(AuditableModel):
usuario = models.ForeignKey(User, null=False, blank=False, related_name='dominios')
dominio = models.ForeignKey(Dominio, null=False, blank=False, related_name='conductores')
is_owner = models.BooleanField(default=False, null=False)
#
# def __unicode__(self):
# return str(self.pk)
class Meta:
verbose_name_plural = "conductores"
串行器
class ConductorSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Conductor
fields = ('id', 'url', 'usuario', 'dominio', 'is_owner')
class DominioSerializer(serializers.HyperlinkedModelSerializer):
owners = serializers.HyperlinkedRelatedField(read_only=True, view_name='conductor-detail')
class Meta:
model = Dominio
fields = ('id', 'url', 'dominio', 'pais', 'owners')
结果 “所有者”:“http:// localhost:8000 / ventana / api / v1 / conductores / Conductor%20object /”
Django rest framework api response
但是,如果我更改@property所有者方法以返回驱动程序列表(conductores),那么网址是正确的
模型
class Dominio(AuditableModel):
dominio = models.CharField(max_length=200, blank=False, null=False, unique=True)
pais = models.ForeignKey(Pais, null=False, blank=False)
@property
def owners(self):
if self.conductores.count() > 0:
return self.conductores.filter(is_owner=True).all()
else:
return []
串行器
class DominioSerializer(serializers.HyperlinkedModelSerializer):
owners = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='conductor-detail')
class Meta:
model = Dominio
fields = ('id', 'url', 'dominio', 'pais', 'owners')
结果 “所有者”:[“http:// localhost:8000 / ventana / api / v1 / conductores / 1 /”]