首页 > 解决方案 > Django queryset to string 在测试中不返回字符串

问题描述

我正在尝试为此模型编写单元测试:

ADMIN = 1
FULL_USER = 2
LIMITED_USER = 3

class Role(models.Model):
  """
  The class stores the model to store the different role which will be used to assign permissions
  to the users.
  """
  ROLE_CHOICES = (
        (ADMIN, 'admin'),
        (FULL_USER, 'full_user'),
        (LIMITED_USER, 'limited_user')
  )

  id = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, primary_key=True)
  name = models.CharField('name', max_length=30)

  def __str__(self):
    """String for representing the Model object."""
    if self.name:
      return self.name
    return self.id

所以我写了这个测试:

from example.models import Role
from rest_framework.test import APITestCase

class RoleModel(APITestCase):

    fixtures = ["initial_data/role.json"]

    def test_get_admin_role(self):
        role = Role.objects.filter(id=1)
        self.assertEqual(str(role), 'admin')

但我无法理解为什么它会失败:

AssertionError: '<QuerySet [<Role: admin>]>' != 'admin'
- <QuerySet [<Role: admin>]>
+ admin

我已经阅读了有关如何获取查询集字符串的类似问题,它应该是在__str__. 但我不知道<QuerySet [<Role: HERE_IS_MY_STRING]>如果我要求对象的字符串表示,它为什么会被包围。

标签: djangodjango-rest-frameworkdjango-testingdjango-tests

解决方案


role是 s 的QuerySet(集合)Role。一个集合可以包含零个、一个或多个Roles。集合对象不同。

您可以使用[Django-doc]获取Role 对象.get(…)

def test_get_admin_role(self):
    role = Role.objects.get(id=1)
    self.assertEqual(str(role), 'admin')

请注意,一个__str__对象应该总是返回一个string,而不是一个int例子。因此,在该__str__方法中,您应该调用:str(…).id

def __str__(self):
    """String for representing the Model object."""
    if self.name:
        return self.name
    return str(self.id)

推荐阅读