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?
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.
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.
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.