问题
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
)
But how can I hyperlink set to fields via url like fields/?set=dimensional
(!query parameter) instead of sets/dimensional/fields/
(argument in url)?
Is there any built-in way to do that instead of overriding HyperlinkedIdentityField
?
回答1:
You can do this two different ways: with a custom HyperlinkedRelatedField
or a custom method on the serializer that is called.
@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
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
来源:https://stackoverflow.com/questions/21338635/django-rest-framework-hyperlink-entities-via-query-parameters