Джанго. Как написать фильтр для текущего пользователя? - PullRequest
0 голосов
/ 12 марта 2019

Приложение листингов имеет таблицу листинга:

class Listing(models.Model):
    realtor = models.ForeignKey(Realtor, on_delete=models.CASCADE, verbose_name='Риэлтор')
    region = models.CharField(default="Чуйская", max_length=100, verbose_name='Область')
    city = models.CharField(default="Бишкек", max_length=100, verbose_name='Город')
    district = models.CharField(blank=True, max_length=100, verbose_name='Район')
    title = models.CharField(max_length=200, verbose_name='Заголовок')
    address = models.CharField(blank=True, max_length=200, verbose_name='Адрес')
    description = models.TextField(blank=True, verbose_name='Описание') 
    stage = models.IntegerField(blank=True, verbose_name='Этажность')
    rooms = models.IntegerField(blank=True, verbose_name='Количество комнат')   
    garage = models.IntegerField(default=0, blank=True, verbose_name='Гараж')
    sqmt = models.IntegerField(blank=True, verbose_name='Площадь')
    price = models.IntegerField(blank=True, verbose_name='Цена')
    photo_main = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Основное фото')
    photo_1 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Фото 1')
    photo_2 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Фото 2')
    photo_3 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Фото 3')
    photo_4 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Фото 4')
    photo_5 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Фото 5')
    photo_6 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True, verbose_name='Фото 6')
    is_published = models.BooleanField(default=True, verbose_name='Публично')
    list_date = models.DateTimeField(default=datetime.now, blank=True, verbose_name='Дата публикации')

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = 'Объявление'
        verbose_name_plural = 'Объявления'

В приложении риэлторов есть модель риэлтора:

class Realtor(models.Model):
    user_name = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name='Пользователь', related_name='realtor')
    name = models.CharField(max_length=20, verbose_name='Имя')
    photo = models.ImageField(upload_to='photos/%Y/%m/%d/', verbose_name='Фото')
    description = models.TextField(blank=True, verbose_name='Описание')
    phone = models.CharField(max_length=20, verbose_name='Телефон')
    email = models.CharField(max_length=50, verbose_name='Email')
    is_mvp = models.BooleanField(default=False, verbose_name='Реэлтор месяца')
    hire_date = models.DateTimeField(default=datetime.now, blank=True, verbose_name='Дата приёма на работу')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Риэлтор'
        verbose_name_plural = 'Риэлторы'

В приложении аккаунтов есть функция, которая вЛичный кабинет должен показывать рекламу текущего пользователя, только когда он находится в системе:

    from django.shortcuts import render, redirect
    from django.contrib.auth.models import User
    from listings.models import Listing
    from realtors.models import Realtor

    def dashboard(request):
      listings = Listing.objects.order_by('-list_date').filter(user_name=request.user)

      paginator = Paginator(listings, 6)
      page = request.GET.get('page')
      paged_listings = paginator.get_page(page)

      context = {
        'listings': paged_listings
      }
      return render(request, 'accounts/dashboard.html', context
)

Как правильно зарегистрировать этот фильтр, чтобы все работало так, чтобы показывались объявления текущего пользователя:

listings = Listing.objects.order_by('-list_date').filter(user_name=request.user)

В данный момент эта ошибка:

Невозможно разрешить ключевое слово 'user_name' в поле.Возможные варианты: адрес, город, описание, район, гараж, id, is_published, list_date, photo_1, photo_2, photo_3, photo_4, photo_5, photo_6, photo_main, цена, посредник, риэлтор_id, регион, комнаты, sqmt, stage, title

Кому не сложно, помогите пожалуйста.Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 12 марта 2019

Поскольку в Listing нет поля user_name, попытка выполнить фильтрацию по нему является ошибкой.

Вместо этого вы, вероятно, пытаетесь выполнить фильтрацию по риэлтору, что можно сделать с помощью поиск, который охватывает отношения :

listings = Listing.objects.order_by('-list_date').filter(realtor__user_name=request.user)
1 голос
/ 12 марта 2019

user_name - это поле в модели риэлтора, а не в листинге.Эти две модели связаны с помощью ForeignKey, поэтому вам нужно пройти через это отношение, используя синтаксис с двойным подчеркиванием.

Listing.objects.order_by('-list_date').filter(realtor__user_name=request.user)

Обратите внимание, что user_name - очень странное имя для этого поля;это не имя, это сам объект User.Это должно быть названо просто user.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...