Django обрабатывает внешние ключи таблиц в VIEWS в postgres; QuerySet всегда пуст - PullRequest
0 голосов
/ 16 марта 2012

Django или, возможно, POSTGRESQL теряет информацию о первичных ключах и внешних ключах, когда вы создаете представление, которое относится к представлению, которое относится к таблице, имеющей первичные и внешние ключи?

У меня есть View-A (все 3 поля являются внешними ключами), и это представление получает 2 поля из View-B.View-B получает свои поля из таблицы-C.Таблица C имеет первичный ключ и внешний ключ.

Итак, когда я обращаюсь к View-A с моей моделью django, как мне обрабатывать эти поля?Я знаю, что это внешние ключи, но любой вид фильтра приводит к пустому Queryset.если я использую что-то вроде

myview = viewA.objects.using(db).all()  # getting all the data
myview2= viewA.objects.using(db).all()[:5] # getting 5 objects

.

class viewA(models.Model):
class Meta:
    db_table = "viewA"

x = models.ForeignKey(x, primary_key=True)
y = models.ForeignKey(y)
z = models.ForeignKey(z)

Проблема в том, что я не могу фильтровать!

response=viewA.objects.using(db).filter(y_id=1)  ERROR:= FieldError

За всеми этими FK есть целое число/ bigint fields.

Редактировать: Поскольку это ВНУТРЕННИЕ СОЕДИНЕНИЯ, я хотел бы получить доступ не только к полям из ViewA, но и из ViewB.x, y, z относятся к типу ViewB.Может быть, использовать select_related () ?

То есть какие-либо подсказки, если Django или postgres теряют информацию о ключах в представлениях, которые относятся к другим представлениям?

1 Ответ

0 голосов
/ 16 марта 2012

Смотрите мои два комментария; однако, чтобы ответить на ваш конкретный «запрос».

Если вы идете в документы и видите этот абзац:

https://docs.djangoproject.com/en/dev/ref/models/fields/#database-representation

Вы заметите, что по умолчанию к внешним ключам добавляется _id. Теперь, есть случаи, когда вам нужно получить доступ к имени столбца напрямую, и это хорошая идея, чтобы знать о столбце как о чем-то вроде «более широкой картины», но в отношении Model API вы должны, когда делая что-то против внешнего ключа, используйте имя атрибута, указанное в экземпляре модели.

Редактировать из вашего комментария:

Если вы хотите развернуть и отфильтровать какое-то поле в объекте Foreignkey, просто введите y__fieldname = somevalue

Обратите внимание, что имя поля должно быть в объекте y.

Если вы возвращаетесь и пустой набор запросов, это потому, что ничто в этом столбце не соответствует значению, которое вы ему дали.

Чтобы проверить это, создайте набор запросов непосредственно на объекте "y", а затем попробуйте выполнить y.objects.fitler (fieldname = somevalue)

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

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