Как сделать фильтрацию при использовании трёх таблиц, связанных между собой?
Задача: Вывести все посты из таблицы "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, Спасибо вам огромное, всё работает, учиться и учиться)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для реализации фильтрации при использовании трех таблиц, связанных между собой, вам необходимо использовать 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 >= '2022-01-01' AND products.product_name = 'Phone';
В данном примере, мы выбираем имя пользователя, дату заказа и название продукта из таблиц "users", "orders" и "products" соответственно. Затем мы объединяем эти таблицы с помощью операторов JOIN, указывая условия связывания ключей (user_id и product_id). Наконец, мы применяем фильтры с помощью оператора WHERE, чтобы выбрать только данные, которые соответствуют заданным условиям (имя пользователя, дата заказа и название продукта).
Помните, что перед выполнением подобного запроса необходимо убедиться, что все ключи и отношения между таблицами корректно настроены, чтобы избежать ошибок при выполнении запроса.