如果选择了m2m字段对象,则为Django

时间:2014-03-13 00:11:41

标签: django django-models django-templates django-views

尝试根据所选的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>],因此我怎样才能看到是否在视图或模板中选择了电话。

2 个答案:

答案 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)