Python 相关对象的Django查询集
具有以下型号:Python 相关对象的Django查询集,python,django,django-queryset,Python,Django,Django Queryset,具有以下型号: 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=P
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
使用
会是
在这里获取查询集的方法是什么?首先,您必须将外键绑定到您的公司或部门
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
别忘了相关名称必须是唯一的首先,您必须将外键绑定到您的公司或部门
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
别忘了相关名称必须是唯一的在我的例子中,我认为只需
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()
def persons_by_company(公司名称):
返回Person.objects.filter(部门\公司\名称\ iexact=公司\名称)。distinct()
它返回一个查询集,速度更快。我使用iexact
避免区分大小写
更新:
.distinct()
只是为了删除重复的条目。在我的例子中,我认为只需
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()
def persons_by_company(公司名称):
返回Person.objects.filter(部门\公司\名称\ iexact=公司\名称)。distinct()
它返回一个查询集,速度更快。我使用iexact
避免区分大小写
更新:
.distinct()
只是为了删除重复条目。这个Person.objects.filter(部门公司id=company公司id)
?这个Person.objects.filter(部门公司id=company公司id)
怎么样?我认为它不起作用-部门是一个多对多的领域(一个人可以有多个DepartmentsRect,但您使用department只是为了查找公司,它只会列出与给定公司名称链接的所有人员条目。您测试了吗?您是对的,在我的情况下,部门有更多约束,那么我是否使用Q查询?例如,我想从department.objects.filter获取它(name\uu icontains=“A”)
是的,您可以使用它来查找不同的字段幸运的是,此解决方案不起作用-如果此人在公司的两个部门,它会返回两次我认为不起作用-部门是一个多对多字段(一个人可以有多个DepartmentsRect,但您使用department只是为了查找公司,它只会列出与给定公司名称链接的所有人员条目。您测试了吗?您是对的,在我的情况下,部门有更多约束,那么我是否使用Q查询?例如,我想从department.objects.filter获取它(name\uu icontains=“A”)
是的,您可以使用它来查找不同的字段幸运的是,此解决方案不起作用-如果此人在公司的两个部门,它会返回两次(我的真实模型要复杂得多,这只是一个最小的示例)。我无法更改模型-尤其是您的模型在技术上有所不同-它有N对1的人际关系,我的模型有M对N的关系。在您的模型中,一个人ccacn有多个部门?(我的真实模型要复杂得多,这只是一个最小的示例).我无法更改模型-尤其是您的模型在技术上有所不同-它有N对1的人际关系,我的模型有M对N的关系在您的模型中一个人ccacn有多个部门吗?