Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Django-ORM叉积_Sql_Django_Orm_Outer Join - Fatal编程技术网

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方法一次性完成的能力。