相关对象的 Django 查询集

有以下型号:


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

将会

  1. 慢的

  2. 确实返回列表而不是查询集(不可过滤等)

在这里获取查询集的方法是什么?


料青山看我应如是
浏览 95回答 2
2回答

弑天下

就我而言,我认为这很简单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()只是为了删除重复的条目。

白衣染霜花

首先,您必须将外键绑定到您的公司或部门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不要忘记相关名称必须是唯一的
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python