2011-11-23 14 views
5

tengo un modelo que se parece a lo siguiente:Django condicional único, junto

class LibraryEntry(models.Model): 
    host_lib_song_id = models.IntegerField() 
    song = models.CharField(max_length=200) 
    artist = models.CharField(max_length=200) 
    album = models.CharField(max_length=200) 
    owning_user = models.ForeignKey(User) 
    is_deleted = models.BooleanField(default=False) 

Ahora, si lo que un selecto donde is_deleted=False, la combinación de host_lib_song_id y owning_user debe ser único. ¿Cómo puedo expresar esto?

+0

Ha intentado https://docs.djangoproject.com/en/dev/ref/models/options/#unique-together, ¿o no funcionaría porque solo son únicos si 'is_deleted = False'? – bouteillebleu

+1

Sí, lo intenté. Pero mi is_deleted = False arroja una llave inglesa en eso. –

Respuesta

10

Anulación validate_unique para comprobar la singularidad si is_deleted es False es más apropiado:

... 

def validate_unique(self, exclude=None): 
    if not self.is_deleted and \ 
     LibraryEntry.objects.exclude(pk=self.pk).filter(host_lib_song_id=self.host_lib_song_id, owning_user=self.owning_user).exists(): 
     raise ValidationError('Some error message about uniqueness required') 
    super(LibraryEntry, self).validate_unique(exclude=exclude) 
+0

¿Qué pasa con la cosa 'PageSection'? ¿Es eso un error tipográfico? Además, creo que quiero 'if self.is_deleted' porque solo quiero aplicar esto en cosas que _aren't_ deleted. ¿Derecha? –

+0

Corregir en ambas cuentas. Lo copié de un proyecto en el que estoy trabajando y no lo capté todo. Respuesta actualizada –

+1

¿No generan juntas únicas una restricción de base de datos? Reemplazar 'validate_unique' evitará que Django ejecute las comprobaciones de unicidad, pero luego obtendría un error de integridad cuando intente guardar en db. – Alasdair

4

No se puede expresar esto a través de la restricción Meta.unique_together, sino a través de django's model validation:

class LibraryEntry(models.Model): 
    def clean(self): 
     from django.core.exceptions import ValidationError 
     try: 
      # try to find a duplicate entry and exclude 'self' 
      duplicate = LibraryEntry.objects.exclude(pk=self.pk)\ 
       .get(owning_user=self.owning_user, 
        host_lib_song_id=self.host_lib_song_id, 
        is_deleted=False) 
      raise ValidationError('Library Entry already exists!') 
     except: LibraryEntry.DoesNotExist: 
      # no duplicate found 
      pass 
Cuestiones relacionadas