首页 > 解决方案 > Troubleshooting “Related Field got invalid lookup: id”

问题描述

I have following models in models.py:

class Lesson(models.Model):
KINDS = (
    ('s', 'Обычный'),
    ('k', 'Контрольный')
)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
lesson_type = models.CharField(max_length=1, choices=KINDS, default='s',
                               verbose_name='Обычный/контрольный')
lesson_themes = models.ManyToManyField('LessonTheme', related_query_name='themes',
                                       verbose_name='Темы')
test = models.ManyToManyField('Test', related_query_name='test',
                              verbose_name='Тест')
lesson_time = models.TimeField(verbose_name='Время урока')
lesson_date = models.DateField(verbose_name="Дата урока")
is_done = models.BooleanField(verbose_name="Проведен")
right_answers = models.IntegerField(verbose_name="Количество правильных ответов")

class Meta:
    verbose_name_plural = 'Уроки'
    verbose_name = 'Урок'
    ordering = ['lesson_date', 'lesson_type']

def __str__(self):
    return f'{self.lesson_type}, {self.lesson_date} {self.lesson_time}'

class Test(models.Model):
code = models.IntegerField(verbose_name='Код теста', primary_key=True)
question_count = models.IntegerField(verbose_name='количество вопросов')
content = models.TextField(verbose_name='Контент')
grade = models.IntegerField(verbose_name='Оценка', blank=True, null=True)

class Meta:
    verbose_name_plural = 'Тесты'
    verbose_name = 'Тест'
    ordering = ['code']

def __str__(self):
    return f'{self.code}'


class LessonTheme(models.Model):
code = models.IntegerField(verbose_name='Код урока', primary_key=True)
content = models.TextField(verbose_name='Содержание')
grade = models.IntegerField(verbose_name='Оценка темы')

class Meta:
    verbose_name_plural = 'Темы урока'
    verbose_name = 'Тема урока'
    ordering = ['content']

def __str__(self):
    return f'{self.code}. {self.content[:10]}'

While in the admin.py I have the following:

class LessonAdmin(admin.ModelAdmin):
list_display = ('lesson_date', 'lesson_type', 'lesson_time',
                'is_done', 'right_answers')
list_display_links = ('lesson_date', 'lesson_type')
search_fields = ('lesson_date', 'lesson_type', 'is_done')


class TestAdmin(admin.ModelAdmin):
    list_display = ('code', 'content', 'question_count', 'grade')
    list_display_links = ('code', 'content')
    search_fields = ('code', 'content')


class LessonThemeAdmin(admin.ModelAdmin):
    list_display = ('code', 'content', 'grade')
    list_display_links = ('code', 'content')
    search_fields = ('code', 'content', 'grade')

But when I try to add one lesson in my database I have the following error:

Traceback (most recent call last):

   File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\contrib\admin\options.py", line 616, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\views\decorators\cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\contrib\admin\sites.py", line 232, in inner
    return view(request, *args, **kwargs)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\contrib\admin\options.py", line 1657, in add_view
    return self.changeform_view(request, None, form_url, extra_context)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\utils\decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\utils\decorators.py", line 130, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\contrib\admin\options.py", line 1540, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\contrib\admin\options.py", line 1587, in _changeform_view
    self.save_related(request, form, formsets, not add)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\contrib\admin\options.py", line 1125, in save_related
    form.save_m2m()
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\forms\models.py", line 451, in _save_m2m
    f.save_form_data(self.instance, cleaned_data[f.name])
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\db\models\fields\related.py", line 1668, in save_form_data
    getattr(instance, self.attname).set(data)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\db\models\fields\related_descriptors.py", line 1000, in set
    old_ids = set(self.using(db).values_list(self.target_field.target_field.attname, flat=True))
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\db\models\query.py", line 1221, in using
    clone = self._chain()
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\db\models\query.py", line 1301, in _chain
    obj = self._clone()
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\db\models\query.py", line 1313, in _clone
    c = self.__class__(model=self.model, query=self.query.chain(), using=self._db, hints=self._hints)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\db\models\query.py", line 198, in query
    self._filter_or_exclude_inplace(negate, args, kwargs)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\db\models\query.py", line 968, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\db\models\sql\query.py", line 1393, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\db\models\sql\query.py", line 1412, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\db\models\sql\query.py", line 1347, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "C:\Users\Comp\.virtualenvs\studentwork-_iQSwCAm\lib\site-packages\django\db\models\sql\query.py", line 1184, in build_lookup
    raise FieldError('Related Field got invalid lookup: {}'.format(lookup_name))

Exception Type: FieldError at /admin/studwork/lesson/add/
Exception Value: Related Field got invalid lookup: id

I've already tried to comment models in admin.py, also I tried to add following field in Lesson model, but it didn't work:

id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

标签: exceptiondjango-modelsdjango-admin

解决方案


推荐阅读