我有3个模型,一个自定义用户模型(使用AbstractUser - user/Brand模型)和一个消息模型:
class User(AbstractUser):
is_brand = models.BooleanField(default=False)
is_influencer = models.BooleanField(default=False)
class Brand(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True, related_name="brand_info")
email = models.EmailField()
brand_name = models.CharField(max_length=100, blank=True)
class Message(models.Model):
recipient = models.ForeignKey(User, on_delete=models.CASCADE, related_name='recipient')
sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sender')
message_content = models.TextField()
send_time = models.DateTimeField(auto_now_add=True)
我有一个视图,我想加载与特定品牌相关的所有消息,并且这个页面也将具有属性(来自品牌模型)作为动态URL参数。
下面是views.py的当前代码:
def conversation_view(request, username):
messages = Message.objects.filter(Q(message__sender=username) | Q(message__recipient=username)).order_by('send_time')
return render(request, "conversation.html", {
'messages': messages
})
这里是url。py:
urlpatterns = [
path('conversation/<username>/', views.conversation_view, name='conversation_view')
]
当我尝试加载具有适当对话/URL的页面时,我得到以下错误消息:invalid literal for int() with base 10: 'username'
我不知道为什么Django在这里期待一个int() ?是因为我在视图中使用消息模型的发送者/接收者,这两个都是外键吗?
您在message__sender
上进行过滤,因此它期望User
对象或User
对象的主键。
您可以使用message__sender__username=username
进行过滤,同样适用于recepient
:
def conversation_view(request, username):
messages = Message.objects.filter(
Q(message__sender__username=username) |
Q(message__recipient__username=username)
).order_by('send_time')
return render(request, "conversation.html", {
'messages': messages
})
注意:通常最好使用
settings.AUTH_USER_MODEL
[Django-doc]引用用户模型,而不是使用User
直接建模[Django-doc]。要了解更多信息,您可以查看引用User
模型文档部分。