试图将我模型的外键传递给 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.