为了账号安全,请及时绑定邮箱和手机立即绑定

相关对象的 Django 查询集

相关对象的 Django 查询集

料青山看我应如是 2023-09-19 17:23:40
有以下型号:class Company(models.Model):    name = models.CharField(max_length=10)    class Department(models.Model):    name = models.CharField(max_length=10)    company = models.ForeignKeyField(to=Company)    persons = models.ManyToManyField(to=Person, on_delete=models.PROTECT)class Person(models.Model):    name = models.CharField(max_length=10)我想了解queryset一家公司的所有人员使用def persons_by_company(company_name):    l = []    for d in Department.objects.filter(company__name=company_name):        for p in d.persons:            l.append(p)    return l将会慢的确实返回列表而不是查询集(不可过滤等)在这里获取查询集的方法是什么?
查看完整描述

2 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

就我而言,我认为这很简单

Person.objects.filter(departement__company__id=company_id).distinct()

或使用公司名称:

Person.objects.filter(departement__company__name__iexact=company_name).distinct()

你的函数将变成:

def persons_by_company(company_name):
    return Person.objects.filter(departement__company__name__iexact=company_name).distinct()

它返回一个查询集并且速度更快。我用来iexact避免区分大小写。

更新: .distinct()只是为了删除重复的条目。


查看完整回答
反对 回复 2023-09-19
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

首先,您必须将外键绑定到您的公司或部门


class Department(models.Model):

    name = models.CharField(max_length=10)

    company = models.ForeignKeyField(to=Company, related_name="department_company_key")


class Person(models.Model):

    name = models.CharField(max_length=10)

    person_department = models.ForeignKey(

        'Department',

        related_name="person_department_key"

        on_delete=models.CASCADE,

        blank=False,

        null=False

    )

然后在你的函数中:


def persons_by_company(company_name):

    l = []

    for d in Department.objects.filter(company__name=company_name):

        for p in d.person_department_key.all(): # You also apply some filter()

            l.append(p) # Remember This will append object  not  string or dictionary

    return l

不要忘记相关名称必须是唯一的


查看完整回答
反对 回复 2023-09-19
  • 2 回答
  • 0 关注
  • 93 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信