На самом деле есть разница в том, куда вы помещаете однозначное поле, потому что удаление ведет себя по-разному. Когда вы удаляете объект, любые другие объекты, имеющие отношения один к одному, ссылающиеся на этот объект, будут удалены. Если вместо этого вы удаляете объект, содержащий однозначное поле (то есть оно ссылается на другие объекты, но другие объекты не ссылаются на него), другие объекты не удаляются.
Например:
class A(models.Model):
pass
class B(models.Model):
a = models.OneToOneField(A)
Если вы удалите A, по умолчанию B также будет удален (хотя вы можете переопределить это, изменив аргумент on_delete для OneToOneField, как и ForeignKey ). Удаление B не приведет к удалению A (хотя вы можете изменить это поведение, переопределив метод delete () в B).
Возвращаясь к вашему первоначальному вопросу «имеет-а против-есть-а», если у A есть B, у B должно быть поле «один к одному» (B должно существовать, только если существует A, но A может существовать без B ).