onetoonefield one many example decimalfield python django django-models django-forms

python - many - onetoonefield django



Herencia de modelo Django versus campo OneToOne (1)

Puede usar la señal post_delete para esto.

Entonces usted:

  • Registra las señales de post_delete en ambos modelos
  • Una delet, verifique si el otro objeto existe y elimínelo.

Hay muchos ejemplos sobre la implementación de post_delete señales post_delete en StackOverflow, por lo que dejaré esa parte.

EDITAR: ventajas y desventajas de ambos métodos. SO, tengo tres modelos: Person, Client, Member Person es un modelo base, Client y Member son perfiles para Person.

class Person(AbstractBaseUser, PermissionsMixin): email = models.EmailField( verbose_name=_(''email address''), max_length=255, unique=True, ) class Client(User): #or maybe models.Model and explicit OneToField first_name = models.CharField(verbose_name=_(''first name''), max_length=30) last_name = models.CharField(verbose_name=_(''last name''), max_length=30) class Member(User): #or maybe models.Model and explicit OneToField description = models.CharField(verbose_name=_(''first name''), max_length=255) # other stuff

Entonces, ¿qué quiero?

  1. En administración, cuando agregamos un cliente o miembro, quiero completar el campo de correo electrónico (campos de la clase base) como si estuviera en la clase derivada. Por ejemplo, en admin list_display = (''email'', ''first_name''). No seleccionar casillas para el usuario.

  2. La clase de persona se puede crear una instancia por separado y el "adjunto" al profiel creado. Como persona = Persona (email = "[email protected]"), cliente = Cliente (persona = persona, primer nombre = "prueba" ...). Especialmente, esto debería funcionar en formas. Cuando el usuario (persona) está autenticado, quiero dar la posibilidad de completar el formulario de perfil (cliente) y adjuntar a la persona a este formulario.

  3. Una persona puede tener ambas cuentas. Si borro client / member, la persona correspondiente no debe ser eliminada.

La tercera opción en realidad no es necesaria, pero es útil para mí saber cómo hacerlo.

Entonces, la opción 1 está perfectamente resuelta por herencia, Person is User , pero este enfoque falla cuando se implementa la opción 2. Dado que Person y Client se consideran como un todo, no puedo adjuntar un error clave duplicado del usuario.

La opción 2 se resuelve ampliando los modelos. Modelo y person=models.OnetoOneField(Person,primary_key=True) . Sin embargo, el administrador está roto (primera opción), porque el cliente no tiene campos como el correo electrónico.

Entonces, ¿qué enfoque tomar para resolver los problemas anteriores? ¿Hay formas simples? Si no hay formas simples, ¿hay una forma avanzada, como anular la metaclase, los descriptores de objeto o escribir el campo OneToOne personalizado?

Cualquier sugerencia es bienvenida.

Gracias.