gpt4 book ai didi

python - Django 模型 - 分配 id 而不是对象

转载 作者:太空狗 更新时间:2023-10-29 17:30:50 26 4
gpt4 key购买 nike

如果我的问题被证明是愚蠢的,我深表歉意,但我是 Django 的新手,我无法在任何地方找到答案。

我有以下模型:

class BlackListEntry(models.Model):
user_banned = models.ForeignKey(auth.models.User,related_name="user_banned")
user_banning = models.ForeignKey(auth.models.User,related_name="user_banning")

现在,当我尝试创建一个这样的对象时:

BlackListEntry.objects.create(user_banned=int(user_id),user_banning=int(banning_id))

我收到以下错误:

Cannot assign "1": "BlackListEntry.user_banned" must be a "User" instance.

当然,如果我用这样的东西替换它:

user_banned = User.objects.get(pk=user_id)
user_banning = User.objects.get(pk=banning_id)
BlackListEntry.objects.create(user_banned=user_banned,user_banning=user_banning)

一切正常。问题是:

我的解决方案是否会访问数据库以检索两个用户,如果是,是否可以避免这种情况,只传递 ID?

最佳答案

您的问题的答案是:是。

Django 将(至少)访问数据库 3 次,其中 2 次检索两个 User 对象,第三次提交您想要的信息。这将导致绝对不必要的开销。

试试看:

BlackListEntry.objects.create(user_banned_id=int(user_id),user_banning_id=int(banning_id))

这些是 Django ORM 生成的 FK 字段的默认名称模式。这样就可以直接设置信息,避免查询。

如果您想查询已保存的 BlackListEntry 对象,您可以使用双下划线导航属性,如下所示:

BlackListEntry.objects.filter(user_banned__id=int(user_id),user_banning__id=int(banning_id))

这就是您在 Django 查询集中访问属性的方式。带有双下划线。然后您可以与属性的值进行比较。

虽然非常相似,但它们的工作方式完全不同。第一个直接设置一个属性,而第二个由 django 解析,在 '__' 处拆分,并以正确的方式查询数据库,第二部分是属性的名称。

您始终可以将 user_banneduser_banning 与实际用户对象进行比较,而不是将它们的 ID 进行比较。但是,如果您还没有这些元素,那么这样做就没有用。

希望对您有所帮助。

关于python - Django 模型 - 分配 id 而不是对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12682254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com