Преобразование модели в ее базовую модель - PullRequest
1 голос
/ 16 апреля 2020

Рассмотрим этот файл:

from django.db import models

class Place(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)

class Restaurant(Place):
    serves_hot_dogs = models.BooleanField(default=False)
    serves_pizza = models.BooleanField(default=False)

Теперь предположим, что у меня есть Restaurant с именем restaurant. Но это место больше не ресторан, поэтому я хочу превратить его в место. Для этого я делаю:

p = Place.objects.get(pk=place_id)
p.restaurant.delete()
p.save()

Это хорошо работает, p больше не ресторан, но происходит нечто странное: первичный ключ (ID) p в таблице Place изменяется, как если Место было удалено, а затем воссоздано.

Почему это происходит? И как я могу преобразовать свой ресторан в место без изменения идентификатора места?

1 Ответ

2 голосов
/ 16 апреля 2020

Вы унаследовали restaurant от place и Django, чтобы что-то сделать с такого рода отношениями между двумя таблицами в БД. Django вызывает это Multi-table inheritance. Некоторые особенности этого типа дизайна включают в себя следующее:

  1. PK из двух объектов одинаковы.
  2. Два объекта с точки зрения Django выглядят как один объект, поэтому каждое изменение в PK одного объекта вызывает автоматическое c изменение другого объекта.
  3. Существует an automatically-created OneToOneField отношение между двумя моделями.
  4. Для этих объектов существует транзакция атома c.

Так что это нормальное поведение Django ORM и Django управляют изменениями в PK этих двух объектов. Вы можете прочитать больше об этой концепции с concrete model и multi-table inheritance в этой ссылке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...