Django update_or_create (получить часть), используя связанный объект в качестве kwarg - PullRequest
2 голосов
/ 03 апреля 2019

Я делаю операцию набора запросов update_or_create, которая внутренне использует операцию получения набора запросов.Я прочитал документацию по методу набора запросов 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)

Теперь kwargs будут использоваться в методе 'get', чтобы проверить, существует ли эта глава.Но так как книга - это объект, как Джанго узнает, существует ли глава с «совпадающей» книгой?Проверяет ли все поля объекта книги совпадение?Проверяет ли это только уникальное поле?Только первичный ключ книги?Если у меня есть две книги с одинаковыми полями, но с разными первичными ключами, могут ли они совпадать?Это хорошая практика, чтобы использовать объект в kwargs таким образом, или я рискую получить проблемы с ошибкой целостности?Спасибо.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

здесь, kwargs - это просто словарь, когда вы используете ** напротив него, это означает, что значения распаковываются и передаются следующим образом:

kwargs = {'book': book, 'name': 'Chapter 3'}
Chapter.objects.update_or_create(defaults=defaults, **kwargs)

Переводится в (значения, передаваемые в качестве аргументов ключевых слов):

Chapter.objects.update_or_create(defaults=defaults,book=book, name="Chapter 3")

Теперь, django соответствует первичному ключу книги в главе. Если первичные ключи между двумя объектами книги не совпадают, это означает, что они являются разными объектами независимо от того, что их другие поля одинаковы.

1 голос
/ 03 апреля 2019

В контексте, я предполагаю, что Chapter имеет FK до Book.

В этой погоне Django будет использовать идентификатор поля или, если вы изменили настройку по умолчанию, первичный ключ из экземпляра книги для сопоставления. Это то же самое, что и:

Chapter.objects.update_or_create(defaults=defaults, book=book.id)

Итак, у вас есть сотни книг с точно такими же полями, кроме первичного ключа, django знает, как с этим справиться.

...