Django的REST的框架。通过查询参数实现超链接实体

时间:2014-01-24 17:21:19

标签: python django django-rest-framework

我有两个模型:Field和Set。我希望有一个构成具体集合的字段的超链接。
例如: 网址:sets/应该返回[{'title': 'dimensional', 'fieldsLink': '#url-to-enpoin'}]

写这样的东西并不复杂:

class Field(models.Model):
    title = models.CharField(max_length=255, blank=True, null=True)
    set = models.ForeignKey(Set, related_name='fields', blank=True, null=True)

class Set(models.Model):

    title = models.CharField(max_length=255, blank=True, null=True, unique=True)
    slug = models.SlugField(unique=True)


class SetSerializer(serializers.HyperlinkedModelSerializer):
    field_list = serializers.HyperlinkedIdentityField(
        view_name='apiv1:setfields-list',
        lookup_field='slug')

    class Meta:
        model = Set
        fields = ('title', 'field_list')

urlpatterns = patterns('',
    url(r'^fields/$', views.FieldView.as_view(), name='fields-list'),
    url(r'^sets/$', views.SetView.as_view(), name='sets-list'),
    url(r'^sets/(?P<slug>[\d\w\-]+)/fields/$', views.SetFieldView.as_view(), name='setfields-list'), # this url should be removed
)

但是如何通过url(例如fields/?set=dimensional(!查询参数)而不是sets/dimensional/fields/(url中的参数)超链接设置到字段?

是否有任何内置方法可以执行此操作而不是覆盖HyperlinkedIdentityField

1 个答案:

答案 0 :(得分:4)

您可以通过两种不同的方式执行此操作:使用自定义HyperlinkedRelatedField或调用的序列化程序上的自定义方法。

@kharandziuk最初在问题中提供了自定义字段。

class CustomHyperlinkedIdentityField(HyperlinkedIdentityField):

    def get_url(self, obj, view_name, request, format):
        from rest_framework.reverse import reverse
        lookup_field_value = getattr(obj, self.lookup_field, None)
        result = '{}?{}'.format(
            reverse(view_name, kwargs={}, request=request, format=format),
            urllib.urlencode({self.lookup_field: lookup_field_value})
        )
        return  result

如果您不想创建自己的自定义字段,可以在序列化程序上创建一个返回特定网址的方法。您可能需要在序列化器上使用SerializerMethodField和方法,类似于

def get_the_url(self, obj):
    return self.context["request"].build_absolute_url("/api/fields") + "?set=" + obj.title