проблема посторонних - PullRequest
1 голос
/ 04 мая 2010

Представьте, что у вас есть эта модель:

class Category(models.Model):
      node_id = models.IntegerField(primary_key = True)
      type_id = models.IntegerField(max_length = 20)
      parent_id = models.IntegerField(max_length = 20)
      sort_order = models.IntegerField(max_length = 20)
      name = models.CharField(max_length = 45)
      lft = models.IntegerField(max_length = 20)
      rgt = models.IntegerField(max_length = 20)
      depth = models.IntegerField(max_length = 20)
      added_on = models.DateTimeField(auto_now = True)
      updated_on = models.DateTimeField(auto_now = True)
      status = models.IntegerField(max_length = 20)
      node = models.ForeignKey(Category_info, verbose_name = 'Category_info', to_field = 'node_id'

Важной частью является иностранный ключ. Когда я пытаюсь:

Category.objects.filter(type_id = 15, parent_id = offset, status = 1)

Я получаю сообщение об ошибке, которое возвращает больше, чем категория, и это нормально, потому что он должен возвращать более одного. Но я хочу отфильтровать результаты через другое поле, которое будет иметь тип id (из второй модели)

Вот оно:

class Category_info(models.Model):
      objtree_label_id = models.AutoField(primary_key = True)
      node_id = models.IntegerField(unique = True)
      language_id = models.IntegerField()
      label = models.CharField(max_length = 255)
      type_id = models.IntegerField()

type_id может быть любым числом от 1 до 5. Я отчаянно пытаюсь получить только один результат, где type_id будет номером 1.

Вот что я хочу в sql:

SELECT c.*, ci.*
FROM category c
JOIN category_info ci ON (c.node_id = ci.node_id)
WHERE c.type_id = 15 AND c.parent_id = 50 AND ci.type_id = 1

Любая помощь приветствуется.

Привет

Ответы [ 3 ]

4 голосов
/ 04 мая 2010

Чтобы отфильтровать поля в связанной таблице, используйте двойное подчеркивание. Чтобы получить все Category объекты, у которых type_id связанного Category_info объекта равно 15, используйте:

Category.objects.filter(node__type_id=15)

Затем Джанго автоматически поймет, что вы ссылаетесь на поле type_id в любой таблице, к которой относится node.

0 голосов
/ 04 мая 2010

Хорошо, так ...

select_related () вместе с подчеркиванием работал хорошо ...

0 голосов
/ 04 мая 2010

Так что это все еще не решило мою проблему .. Позвольте мне попытаться объяснить немного больше.

Допустим, что sql:

SELECT c.*, ci.*
FROM category c
JOIN category_info ci ON (c.node_id = ci.node_id)
WHERE c.type_id = 15 AND c.parent_id = 50 

Вернет две строки. Оба идентичных, кроме поля type_id из таблицы category_info, где есть два типа - 1 и 2. Если я добавлю в sql - ci.type_id = 1, я получу правильный результат. Но из того, что я пробовал, даже с нотацией doubleunderscore он по-прежнему возвращает 2 строки в Django.

Теперь у меня есть:

Category.objects.filter(type_id = 15, parent_id = offset, status = 1, node__type_id = 1)

Где node__type_id = 1 представляет "ci.type_id = 1". Но он все еще возвращает два ряда. Когда я удалю «to_field» из определения модели, он пройдет, но вернет неправильные данные, потому что по умолчанию он связывает их с первичным ключом. Затем я попытался отфильтровать данные, связав другой фильтр, но все равно не смог его обойти.

Вот немного отладки, может быть, это поможет:

Caught an exception while rendering: get() returned more than one Category_info -- it returned 2! Lookup parameters were {'node_id__exact': 5379L}

Похоже, он пытается искать только идентификатор_узла, а не тип_идентификатора.

Вздох, я мог бы плакать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...