试图将我模型的外键传递给 URL 以进行动态路由
Trying to pass a foreign key of my model into URL for dynamic routing
我有 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
})
这是我的 urls.py:
urlpatterns = [
path('conversation/<username>/', views.conversation_view, name='conversation_view')
]
当我尝试加载包含适当对话的页面时/URL,我收到以下错误消息:invalid literal for int() with base 10: 'username'
我不确定为什么 Django 在这里需要一个 int() ?是因为我在我看来使用的是 Message 模型中的 sender/recipient,它们都是外键吗?
您在 message__sender
上进行过滤,因此它需要一个 User
对象,或者 User
对象的主键。
但是您可以使用 message__sender__username=username
进行过滤,这同样适用于 recepient
:
def conversation_view(request, username):
messages = Message.objects.filter(
Q(<b>message__sender__username=username</b>) |
Q(<b>message__recipient__username=username</b>)
).order_by('send_time')
return render(request, "conversation.html", {
'messages': messages
})
Note: It is normally better to make use of the settings.AUTH_USER_MODEL
[Django-doc] to refer to the user model, than to use the User
model [Django-doc] directly. For more information you can see the referencing the User
model section of the documentation.
我有 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
})
这是我的 urls.py:
urlpatterns = [
path('conversation/<username>/', views.conversation_view, name='conversation_view')
]
当我尝试加载包含适当对话的页面时/URL,我收到以下错误消息:invalid literal for int() with base 10: 'username'
我不确定为什么 Django 在这里需要一个 int() ?是因为我在我看来使用的是 Message 模型中的 sender/recipient,它们都是外键吗?
您在 message__sender
上进行过滤,因此它需要一个 User
对象,或者 User
对象的主键。
但是您可以使用 message__sender__username=username
进行过滤,这同样适用于 recepient
:
def conversation_view(request, username):
messages = Message.objects.filter(
Q(<b>message__sender__username=username</b>) |
Q(<b>message__recipient__username=username</b>)
).order_by('send_time')
return render(request, "conversation.html", {
'messages': messages
})
Note: It is normally better to make use of the
settings.AUTH_USER_MODEL
[Django-doc] to refer to the user model, than to use theUser
model [Django-doc] directly. For more information you can see the referencing theUser
model section of the documentation.