2017-10-20 6 views
0

Supposons que j'ai un schéma comme ci-dessous:ensemble de données de filtre n'ayant une valeur

Book | Author 
------------- 
B1 | A1 
B1 | A3 
B1 | A2 

B2 | A5 
B2 | A4 
B2 | A3 

B3 | A5 
B3 | A6 
B3 | A1 

B4 | A1 
B4 | A5 
B4 | A6 

avec ci-dessous le modèle:

class Books(models.Model): 
    author = models.CharField(
     max_length=100, 
     blank=False, 
     null=False, 
     db_index=True, 
     verbose_name=_('authors'), 
    ) 
    book = models.CharField(
     max_length=50, 
     blank=False, 
     null=False, 
     db_index=True, 
     verbose_name=_('book'), 
    ) 

    book_type = models.CharField(
     max_length=50, 
     blank=False, 
     null=False, 
     default="regular" 
    ) 

    flavour = models.CharField(
     max_length=10, 
     blank=False, 
     null=False, 
     verbose_name=_('flavour'), 
    ) 
    cost = models.IntegerField() 
    status = models.CharField(
     max_length=100, 
     null=True, 
     blank=True, 
     db_index=True, 
    ) 

et je veux filtrer tous les livres dont l'auteur est pas A1 (B2 dans ce cas)

Ceci est simple SQL en utilisant group by et not having clause, ce que j'ai du mal à faire est de le faire en utilisant django queryset et annoter. La plupart des annotate fonctionnent autour de count que je ne peux pas adapter dans ce cas particulier.

tout pointeur est utile, merci! :)

+0

Pouvez-vous publier les modèles Django? – solarissmoke

+0

@solarissmoke: ajouté – NoobEditor

Répondre

1

Cela devrait faire ce que vous voulez:

Books.objects.exclude(author='A1') 

Si vous voulez une liste distincte de valeurs book alors vous pouvez faire:

Books.objects.exclude(author='A1').values_list('book').distinct() 

Votre modèle Books semble un peu étrange pour moi bien que. Vous ne savez pas quel est votre cas d'utilisation spécifique, mais il semble qu'un modèle Book avec une relation ManyToMany avec un Author pourrait être plus approprié.

+0

son modèle hérité, quand cette table était censée contenir tout ... pas de normalisation .... * péchés de nos ancêtres genre de blesser ici *! :) – NoobEditor