Django 1.5查询,包括来自其他模型的列

时间:2013-08-16 16:35:48

标签: mysql django django-models foreign-keys

我希望在我的查询中包含其他表中的列。 我希望在报告中包含报告中的所有列以及产品和制造商中的名称列。

我当前的查询如下所示:

latest = Report.objects.values('date').latest('date')['date'].strftime('%Y-%m-%d')`]
rows = Report.objects.filter(date=latest).order_by('platform')

-

#
class Manufacturer(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(blank=False,null=False,unique=True,max_length=100)
comment = models.CharField(blank=True,null=True,max_length=200)
def __unicode__(self):
    return u'%s' % self.name

#
class Product(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(blank=False,null=False,unique=True,max_length=100)
manufacturer = models.ForeignKey(Manufacturer,related_name="products",null=True,blank=True)
comment = models.CharField(blank=True,null=True,max_length=200)
timestamp = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
    return u'%s' % self.name

#
class Part(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(blank=False,null=False,unique=True,max_length=100)
product = models.ForeignKey(Product,related_name="parts",null=True,blank=True)
comment = models.CharField(blank=True,null=True,max_length=200)
timestamp = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
    return u'%s' % self.name

#
class Platform(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(blank=False,null=False,unique=True,max_length=100)
comment = models.CharField(blank=True,null=True,max_length=200)
timestamp = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
    return u'%s' % self.name

#
class Report(models.Model):
id = models.AutoField(primary_key=True)
part = models.ForeignKey(Part,related_name="reports")

2 个答案:

答案 0 :(得分:1)

您实际上不需要在中包含元素。事实上,您已经拥有它们:您只需要检索相关对象

使用您的代码,最新报告模型上的查询集,其中部分上有外键模型

# in any *.py files, such as views.py
for report in rows:
    # You can access the Part object, so you can access Product, 
    # so you can access Manufacturer, just by hooking through the reverse relationship
    product_name = report.part.product.name
    manufacturer_name = report.part.product.manufacturer.name

您也可以从模板中访问这些元素:

# in your template.html
{% for report in rows %}
<p>Part: <span>{{ report.part }}</span></p>
<p>Product: <span>{{ report.part.product.name }}</span></p>
<p>Manufacturer: <span>{{ report.part.product.manufacturer.name }}</span></p>

正如您所看到的,查询集中已经包含了所有内容。

答案 1 :(得分:0)

您可以使用report.part.product.namereport.part.product.manufacturer.name获取报告的产品和制造商名称。

所以你可以(使用你当前的查询):

for report in rows:
    product_name = report.part.product.name
    manufacturer_name = report.part.product.manufacturer.name

有更好的方法可以做到这一点,但这取决于你想对名字做什么,所以如果你需要帮助,你需要更具体一些。如果您最终使用简单的for循环,那么您可能需要查看select_related以避免为rows中的每个报告触发额外查询。