Django OneToOneField - добавить в родительское или дочернее поле?
Каким образом правильно добавлять OneToOneField в Django? В родительский или дочерний класс? Официальная документация не объясняет этого. Какой способ лучше работает со встроенным интерфейсом администратора? Имеет ли это значение? Есть ли какая-то конвенция?
Что такое "правильный" способ?
class Client(models.Model):
name = models.CharField(max_length=30)
portfolio = models.OneToOneField(to="Portfolio", null=True, on_delete=models.CASCADE)
class Portfolio(models.Model):
... portfolio fields ...
или
class Client(models.Model):
name = models.CharField(max_length=30)
class Portfolio(models.Model):
client = models.OneToOneField(to="Client", null=True, on_delete=models.CASCADE)
... portfolio fields ...
Я вижу, что большинство примеров добавляют его к дочернему объекту, но, кажется, добавление его к родительскому объекту лучше работает с интерфейсами администратора и имеет больше смысла с точки зрения логики.
Вообще лучше добавлять в дочерний класс, но эти вещи делаются в соответствии с представлением формы, так как добавление portfolio
при добавлении клиента в модели Client
более логично, чем добавление client
в модели Portfolio
, То же самое касается и ManyToManyField, так как в документации говорится в одном из примеров модели Pizza
и Topping
, что логичнее добавить количество видов начинок в пицце, чем добавлять, сколько пицц будет сделано с помощью конкретной начинки.
Итак, я бы рекомендовал вам выбрать первый подход.
Имеет ли это значение?
Это не обязательно имеет значение и при запросе, если вы запрашиваете через
select_related
, производительность не пострадает.