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, производительность не пострадает.

Вернуться на верх