Django: Не удается разрешить ключевое слово '' в поле. Возможные варианты:

У меня ManyToManyField эта странная проблема с доступом к ManyToManyField .

У меня есть следующие модели.

 class Link(models.Model): title = models.CharField(max_length = 200) url = models.URLField(unique = True) tags = models.ManyToManyField(Tag) creation_date = models.DateTimeField(auto_now_add = True) user = models.ForeignKey(User) likes = models.ManyToManyField(User, related_name = "%(app_label)s_%(class)s_user_likes") dis_likes = models.ManyToManyField(User, related_name = "%(app_label)s_%(class)s_user_dis_likes") class Meta: abstract = True class URL(Link): preview_image = models.URLField() preview_heading = models.CharField(max_length = 100) preview_content = models.CharField(max_length = 100) 

Когда я пытаюсь получить доступ к URL.objects.get(pk=1).likes.all() , я получаю Cannot resolve keyword '' into field. Choices are:... удается Cannot resolve keyword '' into field. Choices are:... Cannot resolve keyword '' into field. Choices are:... ошибка.

URL.objects.get(pk=1).tags.all(), URL.objects.get(pk=1).user и URL.objects.filter(likes=auser, pk=1) работают нормально.

Обновления:

  1. Поля likes а dis_likes добавлены с помощью south через schemamigration
  2. Раньше я использовал Django 1.6.1 , обновленный до Django 1.6.2 , проблема все еще сохраняется
  3. Усеченная база данных, синхронизация ее с новыми таблицами, проблема по-прежнему сохраняется
  4. Частичная трассировка:

     File "F:\system\env\lib\site-packages\django\db\models\manager.py" in all 133. return self.get_queryset() File "F:\system\env\lib\site-packages\django\db\models\fields\related.py" in get_queryset 549. return super(ManyRelatedManager, self).get_queryset().using(db)._next_is_sticky().filter(**self.core_filters) File "F:\system\env\lib\site-packages\django\db\models\query.py" in filter 590. return self._filter_or_exclude(False, *args, **kwargs) File "F:\system\env\lib\site-packages\django\db\models\query.py" in _filter_or_exclude 608. clone.query.add_q(Q(*args, **kwargs)) File "F:\system\env\lib\site-packages\django\db\models\sql\query.py" in add_q 1198. clause = self._add_q(where_part, used_aliases) File "F:\system\env\lib\site-packages\django\db\models\sql\query.py" in _add_q 1234. current_negated=current_negated) File "F:\system\env\lib\site-packages\django\db\models\sql\query.py" in build_filter 1100. allow_explicit_fk=True) File "F:\system\env\lib\site-packages\django\db\models\sql\query.py" in setup_joins 1357. names, opts, allow_many, allow_explicit_fk) File "F:\system\env\lib\site-packages\django\db\models\sql\query.py" in names_to_path 1277. "Choices are: %s" % (name, ", ".join(available))) Exception Type: FieldError at /url/3 Exception Value: Cannot resolve keyword '' into field. Choices are: __app___article_user_dis_likes, __app___article_user_likes, __app___imageurl_user_dis_likes, __app___imageurl_user_likes, __app___review_user_dis_likes, __app___review_user_likes, __app___url_user_dis_likes, __app___url_user_likes, __app___videourl_user_dis_likes, __app___videourl_user_likes, article, date_joined, email, first_name, groups, id, imageurl, is_active, is_staff, is_superuser, last_login, last_name, logentry, password, review, url, user_permissions, username, userobjectpermission, videourl 

Думаю, я нашел проблему. Я полагаю, проблема __app__ с именем моего приложения, которое является __app__ . Поле Django look up предполагает все до того, как __ (double underscore) – это поле, которое в моем случае разрешает “ (пустую строку).

Всегда было трудно назвать приложение по умолчанию и проект, в котором он живет. Мысль __app__ была более питоническим и умным решением. Думаю, я должен переименовать свое приложение в просто app . Надеюсь, это сработает.

Это может произойти, если вы __unicode__ использовать __unicode__ или __str__ в местах, где Django ожидает имя поля. В моем случае я пытался использовать __unicode__ , потому что я даю свои модели значимым реализациям и хотел повторно использовать их в первом столбце таблиц.

Чтобы обойти это, я добавил

 class AdminBase(admin.ModelAdmin): def natural_title(self, obj): return unicode(obj) natural_title.short_description = 'Title' 

где AdminBase – это настраиваемый базовый класс для моих классов admin. Теперь я могу использовать 'natural_title' в качестве имени поля и получать результаты, которые я искал.