django休息框架问题与反向网址

时间:2016-01-07 19:14:17

标签: python django django-rest-framework

我遇到了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的括号== 1.8.0
  • 的django的扩展== 1.5.5
  • django的滤波器== 0.10.0
  • 的django-OAuth的工具包== 0.8.1
  • djangorestframework == 3.3.2
  • psycopg2 == 2.6 等

模型

    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 /”]

Django rest framework api response 2

0 个答案:

没有答案