我遇到了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也没有出现此问题 .

首先,我的虚拟环境是:

  • Django == 1.8.4

  • django-braces == 1.8.0

  • django-extensions == 1.5.5

  • django-filter == 0.10.0

  • django-oauth-toolkit == 0.8.1

  • djangorestframework == 3.3.2

  • psycopg2 == 2.6等

Models

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"

Serializers

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')

result "owners":"http : //localhost:8000/ventana/api/v1/conductores/Conductor%20object/"

Django rest framework api response

但是,如果我更改@property所有者方法以返回驱动程序列表(conductores),那么网址是正确的

Models

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 []

Serializers

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')

Result "owners":["http : //localhost:8000/ventana/api/v1/conductores/1/"]

Django rest framework api response 2