简体   繁体   English

如何过滤django中的外键字段?

[英]How to filter a foreign key field in django?

I'm working on a basic social media project ideally where user gets to join a group and post posts in it.我正在从事一个基本的社交媒体项目,理想情况下,用户可以加入一个群组并在其中发布帖子。 Here's the models i have created:这是我创建的模型:

    class Group(models.Model):
       name = models.CharField(max_length=255,unique=True)
       slug = models.SlugField(allow_unicode=True,unique=True) 
       description = models.TextField(blank=True,default='')
       description_html = models.TextField(editable=False,default='',blank=True)
       members = models.ManyToManyField(User,through="GroupMember")

    class GroupMember(models.Model):
       group = models.ForeignKey(Group,related_name='memberships',on_delete=models.CASCADE)
       user = models.ForeignKey(User,related_name='user_groups',on_delete=models.CASCADE)

    class Post(models.Model):
       user = models.ForeignKey(User,related_name='posts',on_delete=models.CASCADE)
       created_at = models.DateTimeField(auto_now=True)
       message = models.TextField()
       message_html = models.TextField(editable=False)
       group = 
       models.ForeignKey(Group,related_name='posts',null=True,blank=True,on_delete=models.CASCADE)

This works fine.这工作正常。 Problem is when i create an instance of Post.问题是当我创建一个 Post 实例时。 This design lets me post in any/every group.这种设计让我可以在任何/每个组中发帖。 But what i want is, to let the user post only in group(s) which he's/she's a member of.但我想要的是,让用户只在他/她所属的组中发帖。 I don't know how to implement this.我不知道如何实现这一点。 Help me out guys.帮帮我吧伙计们。

One quick and simple way would be to overwrite .save() and disallow adding items where user and group is not in GroupMember:一种快速而简单的方法是覆盖.save()并禁止添加用户和组不在 GroupMember 中的项目:

class Post(models.Model):
    ...

    def save(self, *args, **kwargs):
        if not GroupMember.objects.filter(user=user, group=group).exists():
            raise Exception()

        super().save(*args, **kwargs)

Depending on your project and code structure, you could also use a pre_save() signal to prevent writing such posts.根据您的项目和代码结构,您还可以使用pre_save()信号来防止编写此类帖子。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM