在Django中从多个表中提取数据
我对Django还不太熟悉,正在尝试从已有的表中提取数据。我的目标是从多个连接的表中的列提取数据。我找到了一种解决方案,但感觉有点像是在投机取巧,所以想知道我下面的方法是否合适。
class Sig(models.Model):
sig_id = models.IntegerField(primary_key=True)
parent = models.ForeignKey('self')
state = models.CharField(max_length=2, db_column='state')
release_id = models.SmallIntegerField(choices=releaseChoices)
name = models.CharField(max_length=255)
address = models.CharField(max_length=255, blank=True)
city = models.CharField(max_length=255, blank=True)
zip = models.CharField(max_length=10, blank=True)
phone1 = models.CharField(max_length=255, blank=True)
fax = models.CharField(max_length=255, blank=True)
email = models.EmailField(max_length=255, blank=True)
url = models.URLField(max_length=255, blank=True)
description = models.TextField(blank=True)
contactname = models.CharField(max_length=255, blank=True)
phone2 = models.CharField(max_length=255, blank=True)
ratinggroup = models.BooleanField()
state_id = models.ForeignKey(State, db_column='state_id')
usesigrating = models.BooleanField()
major = models.BooleanField()
class Meta:
db_table = u'sig'
class SigCategory(models.Model):
sig_category_id = models.IntegerField(primary_key=True)
sig = models.ForeignKey(Sig, related_name='sigcategory')
category = models.ForeignKey(Category)
class Meta:
db_table = u'sig_category'
class Category(models.Model):
category_id = models.SmallIntegerField(primary_key=True)
name = models.CharField(max_length=255)
release_id = models.SmallIntegerField()
class Meta:
db_table = u'category'
然后,这是我的解决方案,虽然有效,但我觉得不太对劲:
sigs = Sig.objects.only('sig_id', 'name').extra(
select = {
'category': 'category.name',
},
).filter(
sigcategory__category__category_id = categoryId,
state_id = stateId
).order_by('sigcategory__category__name', 'name')
现在,由于filter()中的项目连接了sigcategory和category模型,我能够通过使用extra()来提取category.name。这种做法算不算合适呢?如果我在filter()中没有引用,连接就不会发生,那该怎么办呢?
1 个回答
2
SigCategory
这个东西有一个外键指向 Category
,所以你可以通过 mysigcategory.category
来轻松获取对应的分类信息(这里的 mysigcategory
是你创建的 SigCategory
实例)。
如果你之前没有从这个实例访问过这个关系,那么在这里访问会导致额外的数据库查询。如果你在意数据库的效率,可以了解一下 select_related
这个功能。