如何在 django 中使用 id 或 pk 检索数据

Posted

技术标签:

【中文标题】如何在 django 中使用 id 或 pk 检索数据【英文标题】:How to retrieve data using id or pk in django 【发布时间】:2021-12-27 00:20:33 【问题描述】:

我正在做一个项目,但在尝试了多种方法后,我仍然找不到解决方案。我需要在页面上获取当前房间,以便用户可以离开房间,我知道这与进行查询或使用 pk,id 有关。 (我的第一个问题,如果提问方式不正确,请见谅)。

这是来自 Views.py 的代码:


def leave_room(request, room):
    room = request.GET['room.pk']
    room_details = Room.objects.get(name=room)
    messages = Messages.objects.filter(room=room_details.pk)
    membership = RoomMember.objects.filter(user=request.user, room=messages)
    membership.delete()
    return redirect("/")

urls.py:

path("leave/<int:pk>/join/", views.leave_room, name="leave_room"),

html:

<a class="btn btn-danger" href="% url 'leave_room' pk=room.pk %">Leave Room</a>

models.py:

class Room(models.Model):
    name = models.CharField(max_length=100)
    about = models.TextField(max_length=500, null=True, blank=True)
    creator = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='room_creator')
    members = models.ManyToManyField(User, through="RoomMember")
    
    
class RoomMember(models.Model):
    approved = models.BooleanField(default=False, blank=False)
    room = models.ForeignKey(Room, related_name='memberships', on_delete=models.CASCADE)
    user = models.ForeignKey(User, related_name='user_groups', on_delete=models.CASCADE)
    
        
class Messages(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False)
    text = models.CharField(max_length=10000, blank=False, null=False)
    date = models.DateTimeField(default=datetime.now)
    room = models.ForeignKey(Room, null=True, blank=False, on_delete=models.CASCADE)

【问题讨论】:

你试试Room.objects.get(pk=room)吗? 你能分享RoomMessagesRoomMember模型吗? 我编辑了我的原始帖子并在其中包含了模型:) 请澄清您的具体问题或提供更多详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。 【参考方案1】:

由于您有一个参数&lt;int:pk&gt;,房间的主键通过pk 参数传递。这意味着leave_room 应该被实现为:

from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_POST

@require_POST
@login_required
def leave_room(request, pk):
    nitems, __ = RoomMember.objects.filter(
        user=request.user, room_id=pk
    ).delete()
    if not nitems:
        raise Http404
    else:
        return redirect('name-of-some-view')

因此,删除链接是向视图发出 POST 请求的迷你表单:

<form method="post" action="% url 'leave_room' pk=room.pk %">
    % csrf_token %
    <button type="submit" class="btn btn-danger">Leave Room</button>
</form>

注意Section 9 of the HTTP protocol 指定像 GET 和 HEAD 这样的请求应该有副作用,所以你 不应更改具有此类请求的实体。通常是 POST、PUT、PATCH 和 DELETE 请求用于此目的。在这种情况下,您可以制作一个小的&lt;form&gt; 将触发 POST 请求,或者您使用一些 AJAX 调用。


注意:您可以使用 @login_required decorator [Django-doc].

【讨论】:

以上是关于如何在 django 中使用 id 或 pk 检索数据的主要内容,如果未能解决你的问题,请参考以下文章

Django 查询 - id vs pk

Django查询 – id vs pk

如何在 HQL 查询中检查 NULL 或无效

如何在保存实例之前获取 django 模型实例的 pk

在 Django Rest 框架 URL 中通过唯一 ID 但不是 PK 获取详细信息

django pk和id