Как сделать фильтрацию при использовании трёх таблиц, связанных между собой?

Ссылка скопирована
1 ответ

Задача: Вывести все посты из таблицы "Post" с только одним условием - "Они должны принадлежать одному адресу (твоему адресу, а все адреса брать из таблицы "Profile")".

Есть три таблицы:
1) User (дефолтная джанговская)

2) Profile

class Profile(models.Model):     user = models.OneToOneField(User, on_delete=models.CASCADE)     image = models.ImageField('Ваша фотография', default='default.jpg', upload_to='profile_pics')     address = models.CharField('Адрес общежития', blank=True, null=True, max_length=250)      def __str__(self):         return f'{self.user.username} Profile'

class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) image = models.ImageField('Ваша фотография', default='default.jpg', upload_to='profile_pics') address = models.CharField('Адрес общежития', blank=True, null=True, max_length=250) def __str__(self): return f'{self.user.username} Profile'

3) Post

class Post(models.Model):     date_posted = models.DateTimeField(default=timezone.now)     author = models.ForeignKey(User, on_delete=models.CASCADE)     title = models.CharField("Название ордера", max_length=120, help_text='Введите текст поста')      price = models.FloatField("Стоимость всей еды", default=0)     price_deliver = models.FloatField("Стоимость доставки", default=0)     date_deliver = models.DateField("Дата ордера", default=timezone.now)     time_deliver = models.TimeField("Время ордера", default='17:30:00')     cnt_people = models.IntegerField("Количество людей", default=2, help_text='Минимум 2, включая вас')      image = models.ImageField(         'Картинка',         upload_to='posts_pics/',         blank=True,         null=True     )      mod = models.CharField('Мод ордера', blank=True, null=True, max_length=250)

class Post(models.Model): date_posted = models.DateTimeField(default=timezone.now) author = models.ForeignKey(User, on_delete=models.CASCADE) title = models.CharField("Название ордера", max_length=120, help_text='Введите текст поста') price = models.FloatField("Стоимость всей еды", default=0) price_deliver = models.FloatField("Стоимость доставки", default=0) date_deliver = models.DateField("Дата ордера", default=timezone.now) time_deliver = models.TimeField("Время ордера", default='17:30:00') cnt_people = models.IntegerField("Количество людей", default=2, help_text='Минимум 2, включая вас') image = models.ImageField( 'Картинка', upload_to='posts_pics/', blank=True, null=True ) mod = models.CharField('Мод ордера', blank=True, null=True, max_length=250)

Я пытался это сделать так:

class PostListView(ListView):     model = Post     template_name = 'main/main.html'     context_object_name = 'posts'      def get_queryset(self):         user = get_object_or_404(Profile, address=self.kwargs.get('address'))         queryset = Post.objects.filter(author=user).order_by('-date_posted')         return queryset

class PostListView(ListView): model = Post template_name = 'main/main.html' context_object_name = 'posts' def get_queryset(self): user = get_object_or_404(Profile, address=self.kwargs.get('address')) queryset = Post.objects.filter(author=user).order_by('-date_posted') return queryset

Но у меня ничего не вышло. Нужно писать запрос как-то по другому, но у меня не хватает опыта и знаний, сижу уже несколько часов на этим
помогите пж написать норм запрос)

Дополнительно:

Фрагменты кода надо размещать в виде текста и оборачивать тэгом code для корректного отображения. Удобно делать кнопкой </>
Это обязательно, см.п.3.8 Регламента.
Сюда же относится traceback, ввод и вывод в консоли и другая структурированная текстовая инфа.

Следует убрать скриншоты и разместить код как указано.

Тут ты получаешь Profile

user = get_object_or_404(Profile, address=self.kwargs.get('address'))

user = get_object_or_404(Profile, address=self.kwargs.get('address'))

Тут почему то втыкаешь Profile в User

queryset = Post.objects.filter(author=user).order_by('-date_posted')

queryset = Post.objects.filter(author=user).order_by('-date_posted')

  • Вот переписал код, но одно всё еще не понимаю, как из списка нужных нам профилей достать соответствующие им записи пользователей?
    def get_queryset(self):         # user = get_object_or_404(Profile, address=self.kwargs.get('address'))  # Общежитие №7         my_address = 'Общежитие №7'         profile_list = Profile.objects.filter(address=my_address)  # Получили список нужных профилей         users_list = User.objects.filter()  # Здесь нужно из списка профилей, получить соответствующих им пользователей         queryset = Post.objects.filter(author=users_list).order_by('-date_posted')         return queryset

    def get_queryset(self): # user = get_object_or_404(Profile, address=self.kwargs.get('address')) # Общежитие №7 my_address = 'Общежитие №7' profile_list = Profile.objects.filter(address=my_address) # Получили список нужных профилей users_list = User.objects.filter() # Здесь нужно из списка профилей, получить соответствующих им пользователей queryset = Post.objects.filter(author=users_list).order_by('-date_posted') return queryset

    Там связь OneToOneField к таблице User:

    class Profile(models.Model):     user = models.OneToOneField(User, on_delete=models.CASCADE)     image = models.ImageField('Ваша фотография', default='default.jpg', upload_to='profile_pics')     address = models.CharField('Адрес общежития', blank=True, null=True, max_length=250)      def __str__(self):         return f'{self.user.username} Profile'

    class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) image = models.ImageField('Ваша фотография', default='default.jpg', upload_to='profile_pics') address = models.CharField('Адрес общежития', blank=True, null=True, max_length=250) def __str__(self): return f'{self.user.username} Profile'

  • qs = Post.objects.filter(author__profile__in=profile_list).order_by('-date_posted')

    qs = Post.objects.filter(author__profile__in=profile_list).order_by('-date_posted')

  • Denis Melnikov, Спасибо вам огромное, всё работает, учиться и учиться)
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ирина WP Ответ

Для реализации фильтрации при использовании трех таблиц, связанных между собой, вам необходимо использовать SQL запрос с использованием операторов JOIN и WHERE. Прежде всего, убедитесь, что у вас есть три таблицы, которые нужно связать между собой.

Предположим, у вас есть таблицы "users", "orders" и "products", где "users" содержит информацию о пользователях, "orders" - информацию о заказах пользователей, а "products" - информацию о продуктах, которые были заказаны.

Для фильтрации данных из этих таблиц, вам нужно выполнить следующий SQL запрос:

SELECT users.username, orders.order_date, products.product_name 
FROM users 
JOIN orders ON users.user_id = orders.user_id 
JOIN products ON orders.product_id = products.product_id 
WHERE users.username = 'John' AND orders.order_date &gt;= '2022-01-01' AND products.product_name = 'Phone';

SELECT users.username, orders.order_date, products.product_name FROM users JOIN orders ON users.user_id = orders.user_id JOIN products ON orders.product_id = products.product_id WHERE users.username = 'John' AND orders.order_date &gt;= '2022-01-01' AND products.product_name = 'Phone';

В данном примере, мы выбираем имя пользователя, дату заказа и название продукта из таблиц "users", "orders" и "products" соответственно. Затем мы объединяем эти таблицы с помощью операторов JOIN, указывая условия связывания ключей (user_id и product_id). Наконец, мы применяем фильтры с помощью оператора WHERE, чтобы выбрать только данные, которые соответствуют заданным условиям (имя пользователя, дата заказа и название продукта).

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

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно