如何为内连接创建 django 查询集对象?

Ato*_*ore 5 python django django-queryset django-views

我有两张桌子。

class DibbsSpiderDibbsMatchedProductFieldsDuplicate(models.Model):
    nsn = models.TextField()
    nsn2 = models.TextField()
    cage = models.TextField()
    part_number = models.TextField()
    company_name = models.TextField(blank=True, null=True)
    supplier = models.TextField(db_column='Supplier', blank=True, null=True)  # Field name made lowercase.
    cost = models.CharField(db_column='Cost', max_length=15, blank=True, null=True)  # Field name made lowercase.
    list_price = models.CharField(db_column='List_Price', max_length=15, blank=True, null=True)  # Field name made lowercase.
    gsa_price = models.CharField(db_column='GSA_Price', max_length=15, blank=True, null=True)  # Field name made lowercase.
    hash = models.TextField()
    nomenclature = models.TextField()
    technical_documents = models.TextField()
    solicitation = models.CharField(max_length=32)
    status = models.CharField(max_length=16)
    purchase_request = models.TextField()
    issued = models.DateField()
    return_by = models.DateField()
    file = models.TextField()
    vendor_part_number = models.TextField()
    manufacturer_name = models.TextField(blank=True, null=True)
    product_name = models.TextField(blank=True, null=True)
    unit = models.CharField(max_length=15, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'dibbs_spider_dibbs_matched_product_fields_duplicate'


class DibbsSpiderSolicitation(models.Model):
    line_items = models.IntegerField()
    nsn = models.TextField()
    nomenclature = models.TextField()
    technical_documents = models.TextField()
    purchase_request = models.TextField()

    class Meta:
        managed = False
        db_table = 'dibbs_spider_solicitation'
Run Code Online (Sandbox Code Playgroud)

对于列上两个表的内部联接,等效的 django 查询是什么nsn?我的观点功能就像

def inner(request,nsn):
    u_m =  DibbsSpiderDibbsMatchedProductFieldsDuplicate.objects.filter(nsn2__icontains=id)
    c_m = DibbsSpiderSolicitation.objects.filter(nsn__icontains=id)
    obj = .......................
    context = {'obj':obj}
    return render(request,,"a.html",context)
Run Code Online (Sandbox Code Playgroud)

查询集应根据公共 nsn 返回两个表的组合。

u_mobj 应返回和的组合c_m。如果u_m仅包含一行且c_m包含多行,则 obj 必须复制 u_m 的值。

Bil*_*eel -1

选项 #1 - 引入外键(推荐):

在类下DibbsSpiderDibbsMatchedProductFieldsDuplicate添加:

fkey = models.ForeignKey('DibbsSpiderSolicitation')
Run Code Online (Sandbox Code Playgroud)

然后你可以轻松访问他们的加入:

obj = DibbsSpiderDibbsMatchedProductFieldsDuplicate.Objects.filter(fkey__nsn).select_related()
Run Code Online (Sandbox Code Playgroud)

现在你可以选择你想做什么nsn2

选项 #2 - 没有 ForeigKey:

原始 SQL:

obj = DibbsSpiderDibbsMatchedProductFieldsDuplicate.objects.extra(where = ['''SELECT *
FROM DibbsSpiderSolicitation
INNER JOIN DibbsSpiderDibbsMatchedProductFieldsDuplicate
ON DibbsSpiderSolicitation.nsn = DibbsSpiderDibbsMatchedProductFieldsDuplicate.nsn2;'''])
# or
obj = DibbsSpiderDibbsMatchedProductFieldsDuplicate.objects.raw('''SELECT *
FROM DibbsSpiderSolicitation
INNER JOIN DibbsSpiderDibbsMatchedProductFieldsDuplicate
ON DibbsSpiderSolicitation.nsn = DibbsSpiderDibbsMatchedProductFieldsDuplicate.nsn2;''')
Run Code Online (Sandbox Code Playgroud)

使用过滤器:

obj = DibbsSpiderSolicitation.objects.filter(nsn__in=DibbsSpiderDibbsMatchedProductFieldsDuplicate.objects.nsn2)
Run Code Online (Sandbox Code Playgroud)

抱歉,我无法进行任何测试。