Когда я пытаюсь выполнить поиск, я получаю эту ошибку: Related Field got invalid lookup: tag

views.py

def home(request):
WAllPAPER_PER_PAGE = 15
WALL = Wallpaper.objects.all()
from django.core.paginator import EmptyPage, Paginator
from django.db.models import Q
qd = request.GET.copy()
qd.pop('page', None)
querystring = qd.urlencode()

#link formatting for ordering
ordering =request.GET.get('ordering', "")

#link formatting for sorting
search = request.GET.get('search', "")
if search:
    wallpapers = Wallpaper.objects.filter(Q(name__icontains=search) | Q(category__category_name__icontains=search) | Q(tags__tag__icontains=search)).distinct().order_by('-pk')
    WALL = None
else:
    wallpapers = Wallpaper.objects.all().order_by('-pk')
if ordering:
    wallpapers = wallpapers.order_by(ordering)
page = request.GET.get('page', 1)
wallpaper_paginator = Paginator(wallpapers, WAllPAPER_PER_PAGE)
try:
    wallpapers = wallpaper_paginator.page(page)
except EmptyPage:
    wallpapers = wallpaper_paginator.page(wallpaper_paginator.num_pages)
except:
    wallpapers = wallpaper_paginator.page(WAllPAPER_PER_PAGE)
context = {'querystring': querystring, "wallpapers": wallpapers, 'page_obj': wallpapers, 'is_paginated': True, 'paginator': wallpaper_paginator, 'WALL': WALL}
return render(request, "Wallpaper/Home.html", context)

models.py

class Tags(models.Model):
tag = models.CharField(max_length=100)

def __str__(self):
    return self.tag

class Category(models.Model):
    category_name = models.CharField(max_length=100)

    def __str__(self):
        return self.category_name

class Wallpaper(models.Model):
    name = models.CharField(max_length=100, null=True)
    size = models.CharField(max_length=50, null=True)
    pub_date = models.DateField('date published', null=True)
    resolution = models.CharField(max_length=100, null=True)
    category = models.ManyToManyField(Category)
    tags = TaggableManager()
    Device_Choices = [
        ('PC', 'pc'),
        ('mobile', 'mobile')
    ]
    Devices = models.CharField(max_length=20,choices=Device_Choices, default= 'PC')
    image = models.ImageField(upload_to='Wallpaper/Images/', default="")

    def __str__(self):
        return self.name

error

Файл "C:\Users\Atharva thaware\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\models\sql\ql\q uery.py", строка 1339, в build_filter raise FieldError('Связанное поле получило недопустимый поиск: {}'.format(lookups[0])) django.core.exceptions.FieldError: Related Field got invalid lookup: tag

в вашем представлении home вы используете:

Wallpaper.objects.filter(Q(tags__tag__icontains=search))

это означает, что объект wallpaper имеет атрибут tags, а значение атрибута tags имеет атрибут tag. кроме того, tags.tag должен быть экземпляром django.model.Model.

А если я вижу class Wallpaper, я не могу найти никакого родственного поля (o2m, m2m) для class tags(Model). Я вижу только:

class Wallpaper(models.Model):
    ...
    tags = TaggableManager()

я думаю, что это datamanager для обоев, а не иностранный ключ к class Tags. Мое мнение - форма множественного числа для имени класса является плохой десигнацией.

Попробуйте добавить теги полей. Что-то вроде этого:

class Wallpaper(models.Model):
    ...
    tags = models.ManyToManyField(Tags)
    tagged = TaggableManager()

Возможно, вы используете не последнюю версию django-taggit. Я провел все утро с этой ошибкой только для того, чтобы понять, что обновление до django-taggit 3.1.0 решило проблему.

Вернуться на верх