En realidad, hay una diferencia en dónde coloca el campo de uno a uno, porque la eliminación se comporta de manera diferente. Cuando elimina un objeto, se eliminará cualquier otro objeto que tenga relaciones uno a uno que hagan referencia a ese objeto. Si, por el contrario, elimina un objeto que contiene un campo de uno a uno (es decir, hace referencia a otros objetos, pero otros objetos no hacen referencia a él), no se eliminan otros objetos.
Por ejemplo:
class A(models.Model):
pass
class B(models.Model):
a = models.OneToOneField(A)
Si elimina A, B por defecto se borrarán también (aunque se puede anular esta modificando el argumento on_delete en el OneToOneField al igual que con ForeignKey). Al eliminar B no se eliminará A (aunque puede cambiar este comportamiento anulando el método delete() en B).
Volviendo a su pregunta inicial de has-a vs. is-a, si A tiene B, B debe tener el campo uno-a-uno (B solo debería existir si A existe, pero A puede existir sin SEGUNDO).
Bueno, esa es la pregunta.¿Cómo averiguo qué tiene más sentido? A veces no hay diferencia y ambas maneras son igualmente posibles. – aemdy
En casos como este, depende completamente de usted. No creo que haya una respuesta definitiva. – Brandon