簡體   English   中英

帶有ORM和條件Where子句的Django聯接表

[英]Django join tables with ORM and conditional Where clause

我有4張桌子要參加; 人員,機器和位置。 如果請求正文包括過濾數據,我想加入這些表並在ORM查詢的末尾添加where子句。 這是我的模型和原始查詢(我想用django ORM編寫此查詢),並為where子句提供條件樣本;

楷模 ;

class Sales(models.Model):
    MachineId = models.ForeignKey(Machines,on_delete=models.CASCADE,db_column='MachineId',related_name='%(class)s_Machine')
    PersonnelId = models.ForeignKey(Personnels,on_delete=models.CASCADE,db_column='PersonnelId',related_name='%(class)s_Personnel')
    LocationId = models.ForeignKey(Locations,on_delete=models.CASCADE,db_column='LocationId',related_name='%(class)s_Location')
    class Meta:
        db_table = "Sales"

class Machines(models.Model):
    Name = models.CharField(max_length=200)
    Fee = models.DecimalField(max_digits=10,decimal_places=3)
    class Meta:
        db_table = "Machines"

class Personnels(models.Model):
    name = models.CharField(max_length=200)
    surname = models.CharField(max_length=200)
    class Meta:
        db_table = "Personnels"


class Locations(models.Model):
    Latitude = models.FloatField()
    Longitude = models.FloatField()
    LocationName = models.CharField(max_length=1000)
    class Meta:
        db_table = "Locations"

如您所見,我有4個模型。 “銷售”表對其他人具有外鍵。 我想使用這些外鍵獲取表中的所有信息。(使用內部聯接)

    query = '''select * from "Sales" as "SL" INNER JOIN "Personnels" as "PL" ON ("SL"."PersonnelId" = "PL"."user_id") INNER JOIN "Machines" as "MC" ON ("SL"."MachineId" = "MC"."id")    INNER JOIN "Locations" as "LC" ON ("SL"."LocationId" = "LC"."id") '''
    if request.method=='POST':
        if request.data['personnel_name'] and request.data['personnel_name'] is not None:
            personnel_name = request.data['personnel_name']
            condition = '''WHERE "PL"."name" = '{0}' '''.format(personnel_name)
            query = query+condition

可以看到,有很多引號(如果我不寫,postgresql會帶來一些麻煩)並且代碼不干凈。

我的問題是,如何使用django ORM編寫此查詢? 如您所見,我想動態添加條件。 我該如何實現?

我將使用傳統的命名方式,只對類名進行了大寫,而模型名則為單數。

class Sale(models.Model):
    machine = models.ForeignKey(Machine, on_delete=models.CASCADE)
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    location = models.ForeignKey(Location, on_delete=models.CASCADE)

如果必須使用現有數據庫連接django應用程序,則db_columndb_table很有用。 如果沒有,django將默認創建明智的表名。 表名稱可以與模型字段名稱不同。

join where創建聯接 ,請使用queryset過濾器

Sale.objects.filter(person__name='Jane Janes')

您可能不需要更多的聯接,因為django將在需要時執行其他查詢,但是可以使用select_related來實現,並且可以提高性能,因為它減少了所需的sql查詢總數。

Sale.objects.filter(person__name='Jane Janes').select_related('machine', 'person', 'location')

檢查評估評估集時將執行的實際SQL可能會很有用。 您可以通過訪問QuerySet.query屬性來執行此操作。

queryset = Sale.objects.select_related('machine').filter(
    person__name='Jim', location__name='London')

print(queryset.query)

暫無
暫無

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

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