Mam dwa modele: post i użytkownik (standardowy model użytkownika Django - w ten sposób poniżej)

class Post(models.Model):
    # post_file = CloudinaryField(resource_type='video',blank=True)
    post_file = models.CharField(max_length=500,blank=False,default="")
    user =  models.ForeignKey(User, on_delete=models.CASCADE)
    description = models.CharField(max_length=150,blank=False,default="")
    approved = models.BooleanField(default=False)
    active = models.BooleanField(default=False)

Chcę filtrować słupki, w którym znajduje się opis postu lub użytkownika.User_name zawiera ciąg wyszukiwania.

Na przykład Szukaj CRIT = 'Merch'

Próbowałem wielu podejść, ale rozwiązanie wciąż mnie unikają.

from django.db.models import Q

active_post_views = Post.objects.filter(active=True, approved=True).select_related('user')


matched_active_post_views = active_post_views.filter(
                Q(description__contains=search_crit) |
                Q(username__contains=search_crit)
            )

Powyższe nie powiedzie się, więc oczywiście nie poprawne. Posiada problem z częścią filtra (USERNAME__Contains = Search_Crit. Próbowałem też Q (user_username__contains = search_crit), bez skorzystania.

Każda rada byłaby bardzo mile widziana.

1
Holger Behrens 9 październik 2020, 13:53

1 odpowiedź

Najlepsza odpowiedź

Nazwa użytkownika znajduje się w polu user, więc filtrujesz z user__username__contains=…. W ten sposób wyglądasz "przez" stosunki z dwoma kolejnymi podkoszulkami (__):

matched_active_post_views = active_post_views.filter(
    Q(description__contains=search_crit) |
    Q(user__username__contains=search_crit)
)

Uwaga : zwykle lepiej jest skorzystać z settings.AUTH_USER_MODEL [Django-doc], aby odnieść się do modelu użytkownika, niż użyć User model [Django-doc] bezpośrednio. Więcej informacji można znaleźć w odwołując się do sekcji User model w dokumentacji.

0
Willem Van Onsem 9 październik 2020, 11:04