Джанго-нонрел на Appengine

class BillList(models.Model):
    username = models.ForeignKey(User)
    billno = models.CharField(max_length=15)


class OrderDetails(models.Model):
    billno = models.ForeignKey(BillList)
    orderdetails = models.TextField()

User находится внутри django.contrib.auth.models.

Мне нужно восстановить все billno конкретного пользователя. Как мне выполнить этот простой запрос в Django-nonrel на Appengine?

Если я сделаю это:

iq = User.objects.filter(username = "name1")
BillList.objects.filter(username = iq)

Затем я получаю сообщение об ошибке: DatabaseError: Subqueries are not supported.

Если я попробую это сразу BillList.objects.filter(username = "restaurant1"), то ValueError: invalid literal for long() with base 10: 'restaurant1'

Я уверен, что должно быть возможно выполнить этот простой запрос! Любые обходные пути?


person user1265125    schedule 20.07.2014    source источник
comment
Я думаю, что фильтр не работает, потому что вы передаете ему не экземпляр модели для фильтрации, а строку, которая является частью модели. Попробуйте выполнить get first, чтобы получить модель, представляющую restaurant1, а затем передать этот экземпляр модели в фильтр.   -  person Paul Collingwood    schedule 20.07.2014
comment
Если вы видите мой первый пример, это именно то, как я пробовал это в первый раз. Я получил объект User, соответствующий name1, а затем попытался отфильтровать BillList с помощью этого объекта. Но похоже такие запросы не поддерживаются!   -  person user1265125    schedule 20.07.2014
comment
Нет, это не то, что ты сделал. Вы получили набор запросов пользователей, соответствующих имени1, и попытались выполнить фильтрацию с помощью этого набора запросов. Но это не поддерживается. Используйте get вместо filter при извлечении пользователя.   -  person Daniel Roseman    schedule 20.07.2014


Ответы (1)


Остальные правильные. Но здесь может быть фундаментальная проблема с вашим пониманием ForeignKey. Например:

username = models.ForeignKey(User)

Это вообще не "имя пользователя". Это пользовательский объект. Более понятным было бы что-то вроде:

user = models.ForeignKey(User)

Объект User — это то, что имеет свойство username. Таким образом, чтобы получить имя пользователя человека, вы должны использовать "

BillList.objects.get(billno = 12345).user.username

Затем ваши запросы становятся:

iq = User.objects.get(username = "name1")
my_list = BillList.objects.all().filter(user = iq)

Или, более прямо:

my_list = iq.billist_set.all()
person GAEfan    schedule 20.07.2014