【问题标题】:Pulling Data From Multiple Tables in Django从 Django 中的多个表中提取数据
【发布时间】:2010-07-26 14:57:29
【问题描述】:

我是 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() 中没有引用并且连接没有发生怎么办?

【问题讨论】:

    标签: python django models


    【解决方案1】:

    SigCategory 有一个 ForeignKey 指向 Category,因此您可以始终通过执行 mysigcategory.category(其中 mysigcategory 是您的 SigCategory 实例)从 SigCategory 获取到 Category。 p>

    如果您之前没有从该实例访问过该关系,则在此处执行此操作会导致额外的数据库查找 - 如果您担心数据库效率,请查看 select_related

    【讨论】:

    • 但是,如果我尝试用类似这样的东西来跳转这种关系:sigs[0].sigcategory.category,我最终会遇到这个异常:'RelatedManager' 对象没有属性'category'
    • 那是因为可以有很多sigcategories。这不是一个实例,它是一个经理。请改用sigs[0].sigcategory.all()[0].category
    • 我不敢相信这逃脱了我。谢谢大家。
    猜你喜欢
    • 1970-01-01
    • 2018-06-30
    • 2020-08-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多