Запрос Django IN как строковый результат - недопустимый литерал для int () с основанием 10 - PullRequest
1 голос
/ 16 апреля 2010

Попытка запросить модель «Избранное», чтобы получить список элементов, избранных пользователем, а затем выполнить запрос к другой модели, чтобы вернуть объекты из этого запроса для представления в шаблон, но я получаю ошибку : "недопустимый литерал для int () с основанием 10"

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

Модель

class Favorite(models.Model):
    # key should be the model name, id is the model.id, and user is the User object.
    key     = models.CharField(max_length=255, unique=True)
    val     = models.IntegerField(default=0)
    user    = models.ForeignKey(User)

    class Admin:
            list_display = ('key', 'id', 'user')

View

def index(request):
    favorites = Favorite.objects.filter(key='blog', user=request.user.pk)
    values = ""

    for favorite in favorites:
            values += "%s," % favorite.val
    #values = "[%s]" % values

    blogs = Blog.objects.filter(pk__in=values)

    return render_to_response('favorite/index.html',
            {
                    "favorites"     : favorites,
                    "blogs"         : blogs,
                    "values"        : values,
            },
            context_instance=RequestContext(request)
    )

enter code here

Ответы [ 2 ]

2 голосов
/ 16 апреля 2010

Что-то, что вы, возможно, захотите сделать, - это преобразовать это в использование инфраструктуры Django ContentTypes, которая предоставляет немного хорошего синтетического сахара ...

class Favorite(models.Model):
    # former 'key' field
    content_type = models.ForeignKey(ContentType)
    # former 'value' filed
    object_id = models.PositiveIntegerField()

    # this gives access directly to the object that content_type+object_id represent
    content_object = generic.GenericForeignKey()

    user    = models.ForeignKey(User)

Ваш взгляд будет выглядеть так:

def index(request):

    favorites = Favorite.objects.filter(
        content_type=ContentType.objects.get_for_model(Blog),
        user = request.user
    )

    return render_to_response('favorite/index.html', 
        { "favorites" : favorites, },
        context_instance=RequestContext(request)
    )

В вашем шаблоне при перечислении через favorites каждая возвращенная модель будет иметь .content_object подарок, который будет экземпляром Blog ...

{% for fav in favorites %}
    {# This would print the blog title for every favorite #} 
    {{ fav.content_object.title }}<br/>
{% endfor %}
1 голос
/ 16 апреля 2010

pk__in не принимает строку с разделенным запятыми списком значений, на самом деле он принимает перечислимое (список или кортеж) со списком значений. Вместо этого сделайте что-то вроде этого:

values = [favorite.val for favorite in favorites]

Вместо цикла for у вас есть. Я думаю, что это должно исправить то, что у вас есть, но так как вы не опубликовали трассировку или в какой строке она содержит ошибки, я не могу быть полностью уверен.

Кроме того, вместо того, чтобы хранить идентификатор из другой таблицы в IntegerField, вам следует подумать о том, чтобы вместо этого просто реорганизовать этот внешний ключ, если это вообще возможно.

...