簡體   English   中英

django查詢語句中如何通過外鍵和自然鍵顯示不同表的字段

[英]How to show fields from different table through foreign key and natural key in django query statement

在 mysql 如果你想獲取不同表中的某些字段,查詢將是這樣的

`select tab1.field, tab2.field1, tab3.fieldA from CustomerOrder tab1, Food tab2, table3 tab3, table4 tab4 where tab1.id=tab2.tab1_id and tab2.id=tab4.tab3_id and tab3.id=tab4.tab3_idx`

此查詢將幫助您獲得上述字段。 我試圖在 django 中做同樣的事情,但它給我的是數字而不是 field_name 它例如而不是 tab2.field1 的墨西哥卷餅它給我發送 ID 號 15

CustomerOrder 是 table1 Food 是 table2 CustomerAddress 是 table3

CustomerOrder 是我的入口點

CustomerOrder.objects.filter(customer=customername)

這些是我的模特

class CustomerOrderManager(models.Manager):
    def get_by_natural_key(self, customer, food, customeraddress):
        return self.get( customer=customer, food=food, customeraddress=customeraddress, ) 
    
#this contains the subject a students registered for in a specific customeraddress
class CustomerOrder(models.Model):
    customer  = models.ForeignKey(User, on_delete=models.CASCADE)
    food = models.ForeignKey(Food, on_delete=models.CASCADE, null=True)
    customeraddress = models.ForeignKey(CustomerAddress, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    objects = CustomerOrderManager()
    class Meta:
        unique_together = [['customer','food','customeraddress']]
        
    #**** when i use this it prevents the pk or id from showing when i save a customerorder
    def natural_key(self):
        return (self.customer, self.food, self.customeraddress)

        

class FoodManager(models.Manager):
    def get_by_natural_key(self, food_type, food_name, description):
        return self.get(food_type=food_type, food_name=food_name, 
                    description=description)
class Food(models.Model):
    food_type = models.CharField(max_length=100, null=True)
    food_name = models.CharField(max_length=100, null=True)
    description = models.TextField(null=True)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    objects = FoodManager()
    class Meta:
        unique_together = [['food_type', 'food_name', 'description']]
    
    def natural_key(self):
        return (self.food_type, self.food_name, self.description)
    

class CustomerManager(models.Manager):
    def get_by_natural_key(self,customer_name):
        return self.get(customer_name=customer_name)

class CustomerAddress(models.Model):
    food_type  = models.CharField(max_length=300, null=True)
    customer_name  = models.CharField(max_length=300, null=True)
    order_date = models.DateField(null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    objects = CustomerManager()
    class Meta:
        unique_together = [['customer_name']]
    
    def natural_key(self):
        return (self.customer_name)

我想這就是你想要做的?

它將為您提供 CustomerOrder 的所有字段以及兩個名為“customer_name”和“food_name”的附加字段。 PS:確保你導入 F. from django.db.models import F

CustomerOrder.objects.filter(customer=customername).all().annotate(customer_name=F('customer__name'), food_name=F('food__food_name'))

我不確定 customer_address,我在您的模型中沒有看到任何“地址”字段。 您可以在調用 model(本例中為 CustomerOrder)的 FK 字段中使用雙下划線“__”遍歷它

暫無
暫無

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

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