如何在Django中创建一个消息模型,可以选择多个人作为收件人



因此,我试图在Django管理中创建一个消息传递模型(用户之间(,在该模型中,发件人可以为消息选择多个收件人。Models.py:

class Message(models.Model):
subject = models.CharField(_("title"), max_length=50, blank=True)
body = models.TextField(verbose_name=")
sender = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete = models.CASCADE,editable=False)
recipient = models.ManyToManyField(settings.AUTH_USER_MODEL) 
def __str__(self):
return str(self.subject)

admin.py:

class MessageAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change): 
instance = form.save(commit=False)
instance.sender = request.user
instance.save()
form.save_m2m()
return instance
def get_queryset(self, request):
qs = super().get_queryset(request)
if request.user.is_superuser:
return qs
sender_query = qs.filter(sender=request.user)
recipient_query = qs.filter(recipient=request.user)
return sender_query | recipient_query

我目前的方法是上面使用ManyToManyField的代码。但这造成了两个错误:

  1. 如果选择了多个收件人,则发件人将多次看到同一条消息,例如,如果发件人选择了三个收件人,他将在查询集中有三个相同的消息

  2. 发件人将无法打开他发送的邮件(如果选择了多个收件人(,因为会出现以下错误:get() returned more than one Message -- it returned 2!。当然;2〃;可以是任何其他号码的

我想不通的是,如果发件人是超级用户,这些错误就不会产生(我认为这意味着我的get_queryset代码有问题(

我在这里做错了什么?

  • 您只需要在每个字段中添加related_name,related_name必须不同,或者可以使用related_name='+'

  • 来自django文档related_name是用于从相关对象返回到此对象的关系的名称。它也是related_query_name 的默认值

  • 的情况下,您为不同的关系设置了相同的名称

相关内容

  • 没有找到相关文章

最新更新