【问题标题】:Creating hyperlinked relations when testing Django Rest Framework测试 Django Rest Framework 时创建超链接关系
【发布时间】:2016-12-28 07:15:11
【问题描述】:

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

我正在尝试使用相关的 Bar 对象创建一个 Foo 对象,但我不确定如何最有效地创建该关系。

# 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')

【问题讨论】:

    标签: django unit-testing testing django-rest-framework


    【解决方案1】:

    直截了当,没有序列化器:

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

    【讨论】:

      【解决方案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']
      

      【讨论】:

        猜你喜欢
        • 2020-03-18
        • 1970-01-01
        • 1970-01-01
        • 2015-02-06
        • 2015-09-18
        • 1970-01-01
        • 2019-08-20
        • 2018-08-27
        • 2016-01-20
        相关资源
        最近更新 更多