Django-Rest-Framework.通过查询参数的超链接实体 [英] Django-Rest-Framework. Hyperlink entities via query parameters

查看:46
本文介绍了Django-Rest-Framework.通过查询参数的超链接实体的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个模型:Field和Set.我想拥有指向构成具体集合的字段的超链接.
例如:url: sets/应该返回 [{'title':'Dimension','fieldsLink':'#url-to-enpoin'}]

I have two models: Field and Set. And I want to have hyperlink to Fields which compose concrete set.
for example: url: sets/ should return [{'title': 'dimensional', 'fieldsLink': '#url-to-enpoin'}]

写这样的东西并不复杂:

There is nothing complicated to write something like this:

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
)

但是如何通过诸如 fields/?set = Dimension (!query参数)之类的URL而不是 sets/Dimension/fields/(在网址)?

But how can I hyperlink set to fields via url like fields/?set=dimensional (!query parameter) instead of sets/dimensional/fields/ (argument in url)?

是否有内置方法来代替 HyperlinkedIdentityField ?

Is there any built-in way to do that instead of overriding HyperlinkedIdentityField?

推荐答案

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

You can do this two different ways: with a custom HyperlinkedRelatedField or a custom method on the serializer that is called.

@kharandziuk 提供了最初在问题中使用的自定义字段.

@kharandziuk provided a custom field originally in the question.

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

如果您不想创建自己的自定义字段,则可以在序列化程序上创建一个返回特定URL的方法.您可能需要使用 SerializerMethodField ,以及序列化程序上与

If you don't want to create your own custom field, you can create a method on your serializer that returns the specific url. You could need to use a SerializerMethodField, and a method on your serializer similar to

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

这篇关于Django-Rest-Framework.通过查询参数的超链接实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆