Estoy tratando de crear un modelo simple para realizar un seguimiento de los cupones de descuento en Django 1.10 (con Postgres 9.5 como base de datos subyacente) y me preguntaba si hay una manera de asegurarme de que una instancia de cupón ( id , tal vez sea un término más preciso ?) no aparece en dos relaciones M2M al mismo tiempo.
Estoy seguro de que todo el mundo está familiarizado con el funcionamiento de los cupones de descuento pero, por si acaso, déjame explicarte mi caso de uso :
Para realizar un seguimiento de esas cosas, tengo un modelo como este:
class CouponTracker(models.Model): # Coupons that require a code to be activated: extra_applied_coupons = ManyToManyField('Coupon', related_name='+') # Coupons that the user could have applied and specifically # said no (such as 5% off if the purchase is small, and wants # to use it later): vetoed_coupons = ManyToManyField('Coupon', related_name='+')Entonces, la pregunta es:
¿Cómo puedo hacer cumplir (a nivel de base de datos, a través de una restricción) que un cupón no aparezca al mismo tiempo en extra_applied_coupons y vetoed_coupons ?
¡Gracias de antemano!
¿Por qué no combina 2 extra_applied_coupons y vetoed_coupons y tiene 1 campo más (por ejemplo, type ) para determinar el grupo de cupones? Entonces el problema será más simple, solo asegúrese de que sea único en 1 relación ManyToMany
class CouponTracker(models.Model): coupons = ManyToManyField('Coupon', related_name='+') type = models.IntegerField(default=0) type puede ser 0 para extra_applied_coupons y 1 para vetoed_coupons . Si desea agregar más atributos de relación, puede consultar https://docs.djangoproject.com/en/1.11/topics/db/models/#extra-fields-on-many-to-many-relationships
Dado que las relaciones ManyToMany crean una tabla separada, AFAIK no puede hacer una restricción UNIQUE en las tablas. Por lo tanto, no hay una forma directa de agregar restricciones en el nivel de base de datos. Revisa esto . O tienes que hacerlo en la capa de aplicación o de alguna manera hackish comoesta