2016-08-21 70 views
1

为Django Rest框架编写测试时,应如何创建超链接关系?测试Django Rest框架时创建超链接关系

我想创建一个Foo对象与一个相关的Bar对象,但我不知道我如何最有效地创建该关系。

# models.py 

import uuid 

from django.db import models 

class Foo(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4) 
    bar = models.ForeignKey('Bar') 

class Bar(models.Model): 
    BarUUID = models.UUIDField(primary_key=True, default=uuid.uuid4 

# serializers.py 

from rest_framework import serializers 
from myapp.models import Bar, Foo 

class FooSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Foo 
     fields = ('url', 'id', 'bar') 

class BarSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Bar 
     fields = ('url', 'BarUUID') 

# views.py 
class FooViewSet(viewsets.ModelViewSet): 
    queryset = Foo.objects.all() 
    serializer_class = FooSerializer 

class BarViewSet(viewsets.ModelViewSet): 
    queryset = Bar.objects.all() 
    serializer_class = BarSerializer 

# urls.py 

from rest_framework import routers 

router = routers.DefaultRouter() 
router.register(r'foos', views.FooViewSet) 
router.register(r'bars', views.BarViewSet) 

# tests.py 

from rest_framework.reverse import reverse 
from rest_framework.test import APITestCase 

class FooTests(APITestCase): 
    def test_create_foo(self): 
     bar = Bar.objects.create() 

     url = reverse('foo-list') 
     data = { 
      'bar': # how do I get the URL? 
     } 

     response = self.client.post(url, data, format='json') 

回答

2

您可以使用串行得到它。

像这样:

from django.test.client import RequestFactory 

from your_app.serializers import BarSerializer 

context = {'request': RequestFactory().get('/')} 
bar_serializer = BarSerializer(bar, context=context) 
bar_serializer.data['url'] 
1

直接的方式,没有串行:

url = 'http://testserver' + reverse('bar-detail', kwargs={'pk': bar.pk})