2014-01-24 87 views
4

我有兩個模型:Field和Set。我想要超鏈接到組成具體集合的字段。
例如: 網址:sets/應該返回[{'title': 'dimensional', 'fieldsLink': '#url-to-enpoin'}]Django-Rest-Framework。通過查詢參數的超鏈接實體

沒有什麼複雜的寫這樣的事情:

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

+0

有沒有內置的方式,據我所知,我在我的代碼中使用類似的解決方案 – nemesisdesign

回答

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 

如果你不想創建自己的自定義字段,你可以在你的序列化器上創建一個返回特定url的方法。你可以需要使用SerializerMethodField,並在您的串行類似的方法來

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