簡體   English   中英

相關對象的Django查詢集

[英]Django queryset of related objects

具有以下模型:

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. 確實返回一個列表而不是一個查詢集(不可過濾等)

在這里獲取查詢集的方法是什么?

就我而言,我認為這很簡單,只需

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()

它返回一個QuerySet,它的速度更快。 我使用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

不要忘記相關名稱必須是唯一的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM