Django update_or_create (get part) 使用相关对象作为 kwarg

Nei*_*eil 5 python django django-queryset

我正在做一个 update_or_create queryset 操作,它在内部使用 get queryset 操作。我已经通读了关于 update_or_create 查询集方法的文档,但是我在理解与外键相关的部分和使用对象作为 kwargs 时遇到了一些困难。

考虑一个例子,我有模型 Book 和 Chapter ,我做这样的事情:

book = Book.objects.get(...)

kwargs = {'book': book, 'name': 'Chapter 3'}
defaults = {'text': '...'}
Chapter.objects.update_or_create(defaults=defaults, **kwargs)
Run Code Online (Sandbox Code Playgroud)

现在 kwargs 将用于 'get' 方法来检查该章节是否存在。但是,既然 book 是一个对象,那么 Django 怎么知道是否有一章“匹配”的书呢?它是否检查 book 对象的所有字段是否匹配?它是否只检查唯一字段?只有书的主键?如果我有两本书具有相同的字段但主键不同,它们可以匹配吗?以这种方式在 kwargs 中使用对象是一种好习惯,还是我会冒着遇到完整性错误问题的风险?谢谢你。

Sta*_*zer 5

在上下文中,我假设Chapter有一个 FK to Book

在该追踪中,Django 将使用字段 ID,或者,如果您更改了默认设置,则使用图书实例中的主键进行匹配。这与执行以下操作相同:

Chapter.objects.update_or_create(defaults=defaults, book=book.id)
Run Code Online (Sandbox Code Playgroud)

所以你有数百本书,除了主键之外,它们的字段完全相同,django 会知道如何处理它。