尝试根据所选的m2m字段对象做一些逻辑
class Contact(models.Model):
name = models.CharField(unique=True, max_length=150)
class Item(models.Model):
...
contact=models.ManyToManyField(Contact, blank=True)
...
所以联系电话,短信,电子邮件,Skype等。现在我需要检查是否在Item.contact中选择了电话,所以我试着这样做:
item = Item.objects.get(pk=1)
if 'Phone' in item.contact.all():
#do some logic
但它不起作用。在模板{{ item.contact.all }}
中提供了[<Contact: Phone>,<Contact: SMS>, <Contact: Email>]
,因此我怎样才能看到是否在视图或模板中选择了电话。
答案 0 :(得分:2)
item.contact.all()
会生成一个Contact
个可复制对象,因此您需要检查name
的{{1}}属性。
如果您需要检查该项目是否有电话联系人,则可以使用以下内容:
contact
或者更简单:
if any(contact for contact in item.contact.all() if contact.name == 'Phone'):
# your logic here
实际上,如果您不需要访问if any(item.contact.filter(name='Phone')):
# your logic
实例,使用.exists()可能是更好的方法:
contact
答案 1 :(得分:0)
一种方法是改变你的班级结构。
class Contact(models.Model):
name = models.CharField(unique=True, max_length=150)
selected = models.BooleanField(initial=True,blank=False,null=False)
class Item(models.Model):
...
contact=models.ManyToManyField(Contact, blank=True)
...
要获得真实的当前联系,你可以试试这个(请原谅我的django它生锈了)
item = Item.objects.get(pk=1)
preferred_contact = item.contact.get(selected__exact=True)