![](/img/trans.png)
[英]How to access other model fields through foreign key in Django Views
[英]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.