Django queryset to string 不 return 测试中的字符串

Django queryset to string does not return the string in a test

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

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]> 包围。

您的 roleQuerySet(集合)的 Role。集合可以包含零个、一个或多个 Role。集合与对象不同

您可以通过 .get(…) [Django-doc]:

获得一个 Role 对象
def test_get_admin_role(self):
    role = Role.objects.<b>get(</b>id=1<b>)</b>
    self.assertEqual(str(role), 'admin')

请注意,__str__ 对象应该总是 return 一个 string,而不是 int。在 __str__ 方法中,您应该在 .id:

上调用 str(…)
def __str__(self):
    """String for representing the Model object."""
    if self.name:
        return self.name
    return <b>str(</b>self.id<b>)</b>