Использование '_id' в Django - PullRequest
       12

Использование '_id' в Django

2 голосов
/ 26 октября 2019

Я немного запутался, как Django обрабатывает свойство _id, когда мы используем ORM с некоторыми моделями, которые используют внешний ключ. Например:

class CartItem(models.Model):
    user = models.ForeignKey('accounts.CustomUser', related_name='carts', on_delete=models.CASCADE, verbose_name='User')
    product = models.ForeignKey('pizza.Product', related_name='carts', on_delete=models.CASCADE, verbose_name=_('Product'))
    quantity = models.SmallIntegerField(verbose_name=_('Quantity'))

И когда я использую ORM с «фильтром», я могу легко использовать что-то вроде:

CartItem.objects.filter(user=1, product=1, quantity=1)

И Django вроде «видеть», что я имею в виду «id»', но когда я использую точно такую ​​же строку кода, но с' create 'вместо' filter ':

CartItem.objects.create(user=1, product=1, quantity=1)

Затем выдается сообщение об ошибке:

Cannotназначьте «1»: «CartItem.user» должен быть экземпляром «CustomUser».

И для его создания мне нужно использовать:

CartItem.objects.create(user_id=1, product_id=1, quantity=1)

Почему это так? Есть ли здесь какое-то правило, которое я не понимаю?

1 Ответ

1 голос
/ 26 октября 2019

Это представление базы данных из ForeignKey [Django-doc] . Ссылка на объект модели представляется в виде:

За кулисами Джанго добавляет "_id" к имени поля, чтобы создать его имя столбца базы данных. В приведенном выше примере таблица базы данных для модели Car будет иметь столбец manufacturer_id. (Вы можете изменить это явно, указав db_column) Однако ваш код никогда не должен иметь дело с именем столбца базы данных, если вы не пишете пользовательский SQL. Вы всегда будете иметь дело с именами полей вашего модельного объекта.

Таким образом, вы можете сказать, что Django создаст столбец-близнец с суффиксом _id. Этот столбец имеет тот же тип, что и тип первичного ключа целевой модели, и, таким образом, этот столбец будет содержать первичный ключ используемого вами объекта модели. Обратите внимание, что вы можете использовать другое поле, на которое вы нацеливаетесь, указав параметр <b>to_field=&hellip;</b> [Django-doc] .

Таким образом, самого ForeignKey не существует в базе данных,это логика Django, которая будет использовать основной объект этого объекта и сохранять его в столбце с суффиксом _id.

...