Как добавить свое настраиваемое поле в django фильтр? - PullRequest
0 голосов
/ 18 марта 2020

Я создаю API для возврата сообщений в профиле пользователя. Сообщения могут быть опубликованы c, только для друзей или с пользовательской конфиденциальностью. Вот мой фильтр:

posts = Post.objects.filter(
            Q(created_by=user, privacy='PUBLIC') | 
            Q(created_by=user, privacy='FRIENDS')|
            Q(created_by=instance, privacy='CUSTOM', custom_list=requested_by.pk))

Здесь я хочу получать сообщения 'friends_only', если запрошенный пользователь является другом пользователя, профиль которого я показываю. Проблема в том, что у меня нет никакой связи между почтой и другом. Я использую модель друга, как показано ниже:

class Friend(models.Model):
    sender = models.ForeignKey(UserProfile, related_name="sender", on_delete=models.CASCADE)
    receiver = models.ForeignKey(UserProfile, related_name="receiver", on_delete=models.CASCADE)
    accepted = models.NullBooleanField(default=None)

и модель Post как:

class Post(BaseModel, models.Model):
    PRIVACY_CHOICES = [
        ('PUBLIC', 'Public'),
        ('PRIVATE', 'Private'),
        ('FRIENDS', 'Friends only'),
        ('CUSTOM', 'Custom')
    ]
    text = models.TextField()
    image = models.ImageField(upload_to="assets/posts/", null=True, blank=True)
    created_by = models.ForeignKey(UserProfile, related_name="posts", on_delete=models.CASCADE)
    privacy = models.CharField(max_length=10, choices=PRIVACY_CHOICES)
    custom_list = models.ManyToManyField(UserProfile, related_name="post_by_friends", blank=True)
    liked_by = models.ManyToManyField(UserProfile, related_name="likes", blank=True)

Мой вопрос заключается в том, как я могу отфильтровать модель Post, указав свое состояние в фильтре is_friend = True

1 Ответ

0 голосов
/ 19 марта 2020

Вы правы, что у вас нет прямой связи между почтой и другом, но у вас есть косвенная связь через UserProfile.

posts = Post.objects.filter(
    Q(created_by=user, privacy='PUBLIC')
    | Q(created_by=user, privacy='FRIENDS')|
    | Q(
        Q(created_by__sender=user) | Q(created_by__receiver=user)
        created_by=instance, privacy='CUSTOM'
    )
).distinct()

Вам не нужно custom_list ManyToManyField .

...