Django中的多对一关系查询

3 投票
2 回答
7943 浏览
提问于 2025-04-16 04:00

有人能告诉我,怎么才能访问与特定组相关的所有联系人吗?我刚开始学Django,按照文档做了这个:

def view_group(request, group_id):
    groups = Group.objects.all()
    group = Group.objects.get(pk=group_id)
    contacts = group.contacts.all()
    return render_to_response('manage/view_group.html', { 'groups' : groups, 'group' : group, 'contacts' : contacts })

“groups”是用来做其他事情的,我试过用“group”和“contacts”,但出现了一个

'Group' object has no attribute 'contacts'

异常。

这是我正在使用的模型

from django.db import models

# Create your models here.

class Group(models.Model):
    name = models.CharField(max_length=255)
    def __unicode__(self):
            return self.name

class Contact(models.Model):
    group = models.ForeignKey(Group)
    forname = models.CharField(max_length=255)
    surname = models.CharField(max_length=255)
    company = models.CharField(max_length=255)
    address = models.CharField(max_length=255)
    zip = models.CharField(max_length=255)
    city = models.CharField(max_length=255)
    tel = models.CharField(max_length=255)
    fax = models.CharField(max_length=255)
    email = models.CharField(max_length=255)
    url = models.CharField(max_length=255)
    salutation = models.CharField(max_length=255)
    title = models.CharField(max_length=255)
    note = models.TextField()
    def __unicode__(self):
            return self.surname

提前谢谢大家!

补充:哦,还有人能告诉我怎么把一个联系人添加到一个组里吗?

2 个回答

3

你需要按照下面的方式修改你的代码:

contacts = group.contact_set.all()

想了解更多细节,可以查看相关的文档

7

一种方法:

group = Group.objects.get(pk=group_id)
contacts_in_group = Contact.objects.filter(group=group)

另一种更符合习惯的方法:

group = Group.objects.get(pk=group_id)
contacts_in_group = group.contact_set.all() 

contact_set 是这个关系的默认名称,具体可以参考 相关对象文档

如果你想的话,可以在定义字段的时候指定自己的名称,比如 related_name='contacts',这样你就可以用 group.contacts.all() 来获取所有联系人。

要给一个组添加新的联系人,你只需要通过组字段把相关的组分配给联系人,然后保存这个联系人:

the_group = Group.objects.get(pk=the_group_id)
newcontact = Contact()
...fill in various details of your Contact here...
newcontact.group = the_group
newcontact.save() 

听起来你会喜欢阅读免费的 Django书籍,这样可以更好地理解这些基础知识。

撰写回答