[英]Pulling Data From Multiple Tables in 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()中沒有引用並且聯接沒有發生怎么辦?
SigCategory
有一個指向Category的ForeignKey,因此您始終可以通過執行mysigcategory.category
(其中mysigcategory
是您的SigCategory實例)從SigCategory轉到Category。
如果您以前從未從該實例訪問該關系,則在此處進行此操作將導致額外的數據庫查找-如果您擔心數據庫效率,請查看select_related
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.