django: forma correcta de manejar un valor NULL único


Estoy usando el siguiente modelo:

class FoodPlanningOnDemand(models.Model):
    catspad = models.ForeignKey('Catspad', null=False, blank=False)
    cat = models.ForeignKey('Cat', null=True, blank=True),
    amount = models.PositiveIntegerField(null=False, blank=False, default=5)
    food_limit = models.PositiveIntegerField(null=False, blank=False, default=0)
    name = models.CharField(max_length=128, null=True, blank=True)
    status = models.BooleanField(default=True, null=False)

    class Meta:
        unique_together = (('catspad', 'cat'))

El campo gato es algo especial, ya que si es nulo significa que la planificación afecta a todos los gatos. Y como no quiero que una planificación sea un duplicado, tampoco quiero que el valor nulo sea único. Pero Django/Postgres no trata nulo como un valor y, por lo tanto, no activa el error de duplicación.

¿Cómo puedo lograr cambiar esto? ¿Debo crear otro campo? Me estoy quedando sin ideas, gracias por tu ayuda.



------------Respuesta------------

Como han señalado otros en los comentarios, NULL no es un valor

Cuando un índice se declara único, varias filas de la tabla con el mismo No se permiten valores indexados. Los valores nulos no se consideran iguales. Un índice único de varias columnas solo rechazará los casos en los que todos estén indexados las columnas son iguales en varias filas.

ref: https://www.postgresql.org/docs/9.5/static/indexes-unique.html

Si esto no es lo que ySi lo desea, debe crear un gato único que pueda identificarse como todos los gatos, por ejemplo:

all_cats = Cat.objects.create(name='__allcats__', ....)

Entonces puede tomar nota de su clave principal o comparar el campo de nombre con __allcats__ para identificar si FoodPlanningOnDemand es aplicable a todos los gatos o a un solo gato.

Puedes hacer lo mismo con CatsPad

Etiquetas: django-models django postgresql

Artículos relacionados:

android - listview no se actualiza

servicios web: cómo extraer/descifrar el tiempo de caducidad del token web Json emitido externamente