簡體   English   中英

在Django中從多個表中提取數據

[英]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.

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