【问题标题】:Asserting for presence of added objects in Django ManyToMany relation断言在 Django ManyToMany 关系中存在添加的对象
【发布时间】:2015-05-13 07:17:59
【问题描述】:

我有以下型号;

class Station(models.Model):
    name = models.CharField(max_length=50)
    address = models.TextField(default='')
    owner = models.ForeignKey(User,default='')
    members = models.ManyToManyField(User, related_name='members')        

现在在下面的代码之后;

user1 = User.objects.create_user(username="username1",
                                     password="password1")
user1.save()
user2 = User.objects.create_user(username="username2",
                                     password="password2")
user2.save()
user3 = User.objects.create_user(username="username3",
                                     password="password3")
user3.save()
station = Station(name="somename",                            
                  address="someaddress",
                  owner=user1,
)
station.save()

station.members.add(user2,user3)

我想断言添加的用户确实是“站”的“成员”

有人告诉我怎么做

assert station.members == [user2,user3] 不会飞。 station.members 实际上是 <Station: Station object>.members

【问题讨论】:

  • 您正在尝试测试 Django 模型而不是您自己的模型,它真的有用吗?
  • @Charlesthk :D 可能不会。可以把它当作一种娱乐;)

标签: django many-to-many


【解决方案1】:

station.members 是经理,即它是相关用户查询的访问者。您需要实际执行一个查询:在本例中为station.members.all()

【讨论】:

【解决方案2】:

您的代码有一些问题,这是我控制台中的输出:

>>> station.members
<django.db.models.fields.related.ManyRelatedManager object at 0x110774b10>

station.members 是一个 ManyRelatedManager,而不是 user2 和 user3 的列表。

station.members.all() 会返回一个 user2 和 user3 的列表,但是 station.members.all() 是一个 QuerySet 而不是一个列表:

>>> type(station.members.all())
<class 'django.db.models.query.QuerySet'>

所以assert station.members.all() == [user2, user3] 永远不会是真的。

【讨论】:

  • 没有,但我可以查看assert user2 in station.members.all()assert user3 in station.members.all()
  • @afzal_SH 我知道你可以做到。只想指出'==' 不起作用。希望这会有所帮助:)
  • 实际上我只需要稍微正确地阅读 Django 关于多对多关系的文档即可。我在发布之后就得到了答案,但是当我到达这里时,丹尼尔罗斯曼得到了答案:)。万一你注意到我最初试图做assert station.members == [user2, user3]甚至assert station.members.all() == [user2, user3] :)
  • @afzal_SH 我完全知道你在做 station.members == 而不是 station.members.all() ==。但是,很明显你接下来要做assert station.members.all() == [user2, user3]。我无意与你争论。只要你得到你需要的东西就很好。
  • @:D 好的!虽然不是真的吵架!
猜你喜欢
  • 2016-09-27
  • 2015-06-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 2012-12-02
  • 1970-01-01
相关资源
最近更新 更多