Получение данных из нескольких таблиц в Django - PullRequest
0 голосов
/ 26 июля 2010

Я немного новичок в 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, я смог вытащить category.name, используя extra (). Это правильный способ сделать это? Что если у меня не было ссылки в filter () и соединение не состоялось?

1 Ответ

2 голосов
/ 26 июля 2010

SigCategory имеет ForeignKey, указывающий на категорию, поэтому вы можете всегда получить из категории SigCategory в категорию, просто набрав mysigcategory.category (где mysigcategory - ваш экземпляр SigCategory.

Если вы ранее не обращались к этим отношениям из этого экземпляра, выполнение этого здесь вызовет дополнительный поиск в базе данных - если вы беспокоитесь об эффективности БД, посмотрите на select_related.

...