簡體   English   中英

如何為內部連接創建 django 查詢集 object?

[英]How to create a django queryset object for inner join?

我有兩張桌子。

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'

對於 nsn 列上兩個表的內部連接,等效的nsn查詢是什么? 我的看法 function 會像

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)

查詢集應該根據共同的nsn返回兩個表的組合。

obj 應該返回u_mc_m的組合。 如果u_m僅包含一行而c_m包含許多行,則 obj 必須復制 u_m 的值。

選項 #1 - 引入 ForeignKey(推薦):

在 class DibbsSpiderDibbsMatchedProductFieldsDuplicate下添加:

fkey = models.ForeignKey('DibbsSpiderSolicitation')

然后您可以輕松訪問他們的加入:

obj = DibbsSpiderDibbsMatchedProductFieldsDuplicate.Objects.filter(fkey__nsn).select_related()

現在你可以選擇你想用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;''')

使用過濾器:

obj = DibbsSpiderSolicitation.objects.filter(nsn__in=DibbsSpiderDibbsMatchedProductFieldsDuplicate.objects.nsn2)

抱歉,我無法測試任何內容。

您可以嘗試一些選項:

  1. 根據這篇文章添加外鍵約束並使用 select_related
  2. 此 stackoverflow 帖子和另一個帶有自定義連接的帖子中提到的原始查詢

3、使用IN查詢按如下邏輯:

DibbsSpiderDibbsMatchedProductFieldsDuplicate.objects.filter(
        nsn2__in=DibbsSpiderSolicitation.objects.filter(nsn__icontains='text_to_search').values('origin'))

首先,很棒的 model 名稱。 讓我們給它們起別名: DibbsSpiderDibbsMatchedProductFieldsDuplicate 是Apples DibbsSpiderSoliitation is Oranges

inner_qs = Apples.objects.all().extra(
    tables=("yourapp_oranges",),
    where=("yourapp_apples.nsn=yourapp_oranges.nsn",),
)

該文檔提到此 api 將被棄用: https://docs.djangoproject.com/en/4.0/ref/models/querysets/#extra

暫無
暫無

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

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