【问题标题】:In django, any user can block any user, if they are blocked they cant see the posts of the blocked users and cant find them too [closed]在 django 中,任何用户都可以阻止任何用户,如果他们被阻止,他们就看不到被阻止用户的帖子,也找不到他们[关闭]
【发布时间】:2020-02-21 11:50:50
【问题描述】:

在我制作的 django 中,用户可以互相关注并获得他们关注的用户的帖子。我现在想实现一个阻止系统,这样任何用户都可以阻止另一个用户,并且被阻止的用户无法看到阻止他们的用户的个人资料或帖子

我的models.py:

class post(models.Model):
title = models.CharField(max_length=100)
image = models.ImageField(upload_to='post_pics', null=True, blank=True)
video = models.FileField(upload_to='post_videos', null=True, blank=True)
content = models.TextField()
likes = models.ManyToManyField(User, related_name='likes', blank=True)
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)

objects = postManager()

def __str__(self):
    return self.title

class Meta:
    ordering = ['-date_posted', 'title']

def get_absolute_url(self):
        return reverse ('blog-home')

def total_likes(self):
    return self.likes.count()

class UserProfileManager(models.Manager):
use_for_related_fields = True
def all(self):
    qs = self.get_queryset().all()
    try:
        if self.instance:
            qs = qs.exclude(user=self.instance)
    except:
        pass
    return qs

def toggle_follow(self, user, to_toggle_user):
    user_profile, created = UserProfile.objects.get_or_create(user=user)
    if to_toggle_user in user_profile.following.all():
       user_profile.following.remove(to_toggle_user)
       added = False
    else:
       user_profile.following.add(to_toggle_user)
       added = True
    return added

def is_following(self, user, followed_by_user):
    user_profile, created = UserProfile.objects.get_or_create(user=user)
    if created:
        return False
    if followed_by_user in user_profile.following.all():
        return True
    return False


class UserProfile(models.Model):
user      = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='owner', on_delete=models.CASCADE)
following = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='followed_by')

objects = UserProfileManager()

def __str__(self):
    return str(self.following.all().count())

def get_following(self):
    users = self.following.all()
    return users.exclude(username=self.user.username)

【问题讨论】:

  • 先生,您能帮我解决这个问题吗? @TheGoldKnight23
  • 我觉得你要求代码为你做这件事,这不是 SO 的目的。我会尝试自己解决问题,然后返回“为什么这不起作用”的具体问题
  • 不,先生,我只是不问代码,我只是想知道。我将为每个用户自己制作一个阻止列表,我在询问我如何才能获得真正的阻止功能,比如如果我阻止你,我将找不到你,也不会像其他社交媒体那样获得帖子。 @TheGoldKnight23

标签: django django-models django-rest-framework django-views


【解决方案1】:

我认为可能有两种不同的方法,首先你有一个自定义的用户模型或配置文件。所以向这个模型添加一个新字段,它是'self'(用户模型本身)的 may_to_many 字段,它是被阻止的用户 id 持有者。 实现起来很简单。

class Profile(models.Model):
    .......
    blocked_users = many_to_many_field(User, related_name="blocked_by")

第二个想法是创建一个新模型,对User模型有一个外键,并且又和User模型有一个多对多的关系。

class Blocked(models.Model):
    user = foreign_key_field(User, related_name="blocked_users", ....)
     usres = many_to_many_field(User, related_name="blocked_by" )

所以你可以这样调用:

user.blocked_users.users.all()

现在您可以访问一个用户blocked_users,因此通过在query_set 上使用过滤器,彼此忽略blocked_users。

from django.db.models import Q
# to ignore user X's blocked users posts
blocked_users = User.objects.get(username=X).blocked_users.users.all()
Post.objects.filter(~Q(author__in=blocked_users))

【讨论】:

  • 明白了!但让我举个例子,如果我在 Instagram 中屏蔽了你,我将看不到你的帖子,你也不会看到我的帖子。现在,如果我想搜索你,我找不到你,因为我屏蔽了你。如何执行此功能@MahdiFirouzjah
  • 对任何查询集进行相同的过滤会得到你想要的
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 2013-07-25
  • 2021-09-13
  • 2020-10-09
  • 2015-09-10
相关资源
最近更新 更多