Django Rest Framework测试HyperlinkedRelatedField

时间:2016-03-10 14:14:50

标签: python django rest python-3.x django-rest-framework

我有一个使用Django Rest Framework 3.3.2和Python 3.4的Django 1.8.9应用程序

我愿意测试我的API是否应该按原样运行。

我坚持进行测试,目的是验证我是否可以通过API将数据发布到模型中。问题是:该模型与另一个模型具有外键关系。 HyperlinkedModelSerializer将此外键转换为超链接。

例如:http://host:port/api/relation-model-name/id-related-model

这是我的测试:(重要的部分是data = {...})

    def test_api_create(self):
       """ Test the creation of new entries via the API """

       url = reverse(self.api_model_url+'-list')

       data = {'sid':'New change entry', 'status':'THE HYPERLINK TO THE RELATED MODEL SHOULD BE HERE', 'name':'New change entry'}

       # Check that a new entry can be created by an administrator via the API
       self.api_client.login(username='admin', password='admin')
       response = self.api_client.post(url, data, format='json')
       content = self.parse_json_response(response, Status.HTTP_201_CREATED)
       self.assertEqual(content['sid'], 'New change entry')

如果我硬编写HyperLink但是我想以通用方式构建它,则此测试有效。 我可以轻松检索相关字段的ID。我想在我的测试中获得超链接。

提前感谢您的帮助!

干杯!

1 个答案:

答案 0 :(得分:1)

您应该查看HyperlinkedRelatedField如何检索网址:

def get_url(self, obj, view_name, request, format):
    """
    Given an object, return the URL that hyperlinks to the object.
    May raise a `NoReverseMatch` if the `view_name` and `lookup_field`
    attributes are not configured to correctly match the URL conf.
    """
    # Unsaved objects will not yet have a valid URL.
    if hasattr(obj, 'pk') and obj.pk in (None, ''):
        return None

    lookup_value = getattr(obj, self.lookup_field)
    kwargs = {self.lookup_url_kwarg: lookup_value}
    return self.reverse(view_name, kwargs=kwargs, request=request, format=format)

self.reverse只是django的正常reverse功能。 所以基本上你只需要view_namelookup_value,在你的情况下是相关字段的id