在Django中从多个表中提取数据

0 投票
1 回答
1018 浏览
提问于 2025-04-16 01:51

我对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 这个功能。

撰写回答