Django:如何检查带有ManyToManyField的对象是否包含其他对象ManyToManyField的全部内容?

2024-09-27 01:28:30 发布

您现在位置:Python中文网/ 问答频道 /正文

class Hero(models.Model):
   talents = models.ManyToManyField(Talent)
   (...)

class Talent(models.Model)
   required_talents = models.ManyToManyField('self', symmetrical=False)
   (...)

我想为Hero创建方法has_required_talents(self, talent),它将检查这个Hero是否有{}为所选的Talent。在

我试过了:

^{pr2}$

但是,当我使用这些测试进行测试时,它无法正常工作:

class HeroTalents(TestCase):
 def setUp(self):
    self.hero=Hero('Duck')
    self.hero.save() 

 def test_has_required_talents(self):
    self.talent1 = Talent(name = "Overpower")
    self.talent1.save()
    self.talent2 = Talent(name = "Overpower2")
    self.talent2.save()
    self.talent2.talents_required.add(self.talent1)
    self.assertFalse(self.hero.has_required_talents(self.talent2), "test1")
    self.hero.talents.add(self.talent1)
    self.assertTrue(self.hero.has_required_talents(self.talent2), "test2")
    self.talent3 = Talent(name = "Overpower3")
    self.talent3.save()
    self.hero.talents.add(self.talent2)
    self.assertTrue(self.hero.has_required_talents(self.talent3), "test3")
    self.talent1.talents_required.add(self.talent3)
    self.assertFalse(self.hero.has_required_talents(self.talent1), "test4")

需要做些什么才能使这项工作成功?在


Tags: nameselfaddmodelssaverequiredclasshas
1条回答
网友
1楼 · 发布于 2024-09-27 01:28:30
def has_required_talents(self, talent)
   required_list = talent.talents_required.values_list('id', flat=True)
   hero_talents = self.hero.talents.values_list('id', flat=True)
   for item in required_list:
      if not item in hero_talents:
         return False
   return True

这将是一种基于列表的方法。也可以将它们转换为集合:

^{pr2}$

但是(我不知道确切的内部结构,你可以运行一些测试)第一种方法应该更快,因为没有转换。在

相关问题 更多 >

    热门问题