我有一个使用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。我想在我的测试中获得超链接。
提前感谢您的帮助!
干杯!
答案 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_name
和lookup_value
,在你的情况下是相关字段的id
。