如何在django模型中测试related_name?

时间:2018-03-28 10:17:57

标签: python django unit-testing

我有一个模特:

@python_2_unicode_compatible
class TelegramUser(models.Model):

    user = models.OneToOneField(settings.AUTH_USER_MODEL, null=True, verbose_name=_('User'), related_name='telegramuser', on_delete=models.CASCADE)
    token = models.CharField(max_length=255, verbose_name=_('Token'))
    chat_id = models.CharField(max_length=255, verbose_name=_('Chat id'), null=True, blank=False)

我需要为此模型的每个字段测试verbose_namerelated_name

所以我正在测试verbose_name

def test_user_label(self):
    field_label = self.telegramuser._meta.get_field('user').verbose_name
    self.assertEquals(field_label,'User')

但如果我尝试测试' related_name',我会收到如下错误:

AttributeError: 'OneToOneField' object has no attribute 'related_name'

但是这个问题并不是因为该字段是OneToOne

docs中,我发现了如何检查related_model

>>> field = user._meta.get_field('user')
>>> print(field.related_model)
<class 'django.contrib.auth.models.User'>

但我从未找到过测试related_name的方法。

1 个答案:

答案 0 :(得分:1)

User模型上,您可以检查反向关系:

self.assertEquals(User._meta.get_field('telegramuser').related_name, 'telegram_user')

然而,正如丹尼尔在评论中所说,这个测试并不有用。 Django应该已经测试了related_nameverbose_name的工作情况。最多可能有一个创建用户和电报用户的测试,然后使用user.telegramuser确保您可以向后追踪一对一字段。