在我的 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)
我认为可能有两种不同的方法,首先你有一个自定义的用户模型或配置文件。因此,向该模型添加一个新字段,它是“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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句