Sql Django-ORM叉积
我有三种型号:Sql Django-ORM叉积,sql,django,orm,outer-join,Sql,Django,Orm,Outer Join,我有三种型号: class Customer(models.Model): pass class IssueType(models.Model): pass class IssueTypeConfigPerCustomer(models.Model): customer=models.ForeignKey(Customer) issue_type=models.ForeignKey(IssueType) class Meta: uniq
class Customer(models.Model):
pass
class IssueType(models.Model):
pass
class IssueTypeConfigPerCustomer(models.Model):
customer=models.ForeignKey(Customer)
issue_type=models.ForeignKey(IssueType)
class Meta:
unique_together=[('customer', 'issue_type')]
在没有IssueTypeConfigPerCustomer对象的情况下,如何查找custmer、issue_类型的所有元组
我想避免Python中的循环。最好采用在DB中解决此问题的解决方案
背景:对于每个客户和每个问题类型,数据库中都应该有一个配置。如果您可以为每个问题类型进行一次数据库访问,请尝试以下未经测试的代码片段: def\U配置: 对于issue_,请在IssueType.objects.all中键入: 对于customer.objects.filter中的客户 issuetypeconfigpercustomer\uuu问题类型=无 : 产量客户、问题类型 缺失=列表缺失\u配置
这可能是好的,除非你有很多问题类型,或者如果你每秒都这样做几次,但是你也可以考虑有一个明智的默认,而不是为每个类型的组合和客户IMHO强制配置一个配置对象,它有点设计气味。 [更新]
我更新了问题:我想避免Python中的循环。最好采用在DB中解决此问题的解决方案 在Django中,每个Queryset要么是一个模型实例列表,要么是一个dict值Queryset,因此如果没有一些Python和可能的多次数据库访问,就不可能返回您想要的格式—一个模型元组列表 最接近交叉乘积的方法是使用不带where参数的额外方法,但它涉及原始SQL和了解其他模型的基础表名: 缺少=Customer.objects.extra select={issue\u type\u id:'appname\u issuetype.id'}, 表=['appname\u issuetype'] 因此,每个客户对象都将有一个额外的属性issue\u type\u id,其中包含一个IssueType的id。您可以使用where参数根据不存在进行筛选,从appname\u issuetypeconfigpercustomer中选择1,其中issuetype\u id=appname\u issuetype.id和customer\u id=appname\u customer.id。使用values方法,您可以获得与所需内容相近的内容—这可能足以验证规则并创建缺少的记录。如果需要IssueType中的其他字段,只需将它们包含在select参数中 为了收集客户列表,IssueType需要如下内容: 交叉乘积=[ customer,IssueType.objects.getpk=customer.issue\u type\u id 为客户提供 顾客。物品。额外费用 select={issue\u type\u id:'appname\u issuetype.id'}, 表=['appname\u issuetype'], 在哪里=[ 不存在 选择1 来自appname\u issuetypeconfigpercustomer 其中issuetype\u id=appname\u issuetype.id 和customer\u id=appname\u customer.id ] ] 这不仅要求访问数据库的次数与基于生成器的版本相同,而且它的可移植性、可读性和可用性也较低。我想您可以使用以下方法将数据库查询的数量减少到几个: 缺少=Customer.objects.extra select={issue\u type\u id:'appname\u issuetype.id'}, 表=['appname\u issuetype'], 在哪里=[ 不存在 选择1 来自appname\u issuetypeconfigpercustomer 其中issuetype\u id=appname\u issuetype.id 和customer\u id=appname\u customer.id ] 问题列表=dict issue.id,issue 发行 IssueType.objects.filter pk\uuu in=setm.issue\u类型\u缺少m的id 交叉产品=[c,问题列表[c.issue\U type\U id]中缺少c] 底线:在最好的情况下,您会以易读性和可移植性为代价进行两次查询。对于Customer和IssueType的每个组合,与强制配置相比,使用合理的默认值可能是更好的设计
这都是未经测试的,如果有家庭作业留给你,对不起。配置从哪里来?@DanielRoseman我更新了问题。我希望现在更清楚:对于每个客户和每个问题类型,DB cross product中都应该有一个配置。最好是在数据库中解决这个问题的解决方案。我担心您将不得不求助于原始SQL,这超出了使用更方便的ORM方法一次性完成的能力。