代码之家  ›  专栏  ›  技术社区  ›  Mike Shultz

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

  •  0
  • Mike Shultz  · 技术社区  · 15 年前

    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()中的项加入了sigcegory和category模型,所以我可以使用extra()拉出category.name。这样做合适吗?如果我在filter()中没有引用并且连接没有发生呢?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Daniel Roseman    15 年前

    SigCategory 从一个类别到另一个类别 mysigcategory.category (其中 mysigcategory 是您的sigcegory实例。

    如果您以前没有从该实例访问过该关系,那么在这里执行该操作将导致额外的数据库查找—如果您关心数据库效率,请查看 select_related