因此,我试图在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
的代码。但这造成了两个错误:
如果选择了多个收件人,则发件人将多次看到同一条消息,例如,如果发件人选择了三个收件人,他将在查询集中有三个相同的消息
发件人将无法打开他发送的邮件(如果选择了多个收件人(,因为会出现以下错误:
get() returned more than one Message -- it returned 2!
。当然;2〃;可以是任何其他号码的
我想不通的是,如果发件人是超级用户,这些错误就不会产生(我认为这意味着我的get_queryset
代码有问题(
我在这里做错了什么?
-
您只需要在每个字段中添加related_name,related_name必须不同,或者可以使用related_name='+'
-
来自django文档related_name是用于从相关对象返回到此对象的关系的名称。它也是related_query_name 的默认值
-
在的情况下,您为不同的关系设置了相同的名称