2015-04-30 2 views
0

J'ai déjà vérifié cette question Getting complement of queryset. Mais ça n'a pas marché. Il semble que ce n'est que l'extraction d'un champ dans le résultat.Je veux utiliser l'ORM django pour obtenir un complément à partir de deux tables

je les deux tableaux suivants:

tableau A

001 a 
    002 b 
    003 C 

tableau B

001 a 
    002 b 
    003 c 
    004 d 
    005 e 

Mon gaol est d'obtenir le complément comme ceci:

complément

004 d 
    005 e 

Comment utiliser l'ORM pour obtenir ce résultat?

les modèles

class WordBase(models.Model): 
    number = models.SlugField(primary_key=True) 
    word = models.CharField(max_length=128) 
    belong = models.CharField(max_length=128) 
    mean = models.TextField() 
    example = models.TextField() 
class PersonalRecord(models.Model): 
    user = models.ForeignKey(User) 
    book = models.CharField(max_length=128) 
    number = models.CharField(max_length=128) 
    begtime= models.CharField(max_length=128) 
    endtime = models.CharField(max_length=128,blank=True,) 
    lasttime = models.CharField(max_length=128,blank=True,) 
    times = models.IntegerField() 
    status = models.IntegerField() 

Répondre

0

La réponse dans le lien fourni devrait être correct. Fondamentalement, ce que vous devez faire est d'exclure l'ensemble A de l'ensemble B.

setA = MyModel.objects.filter(…) # Query for items belonging in set A 
setB = MyModel.objects.filter(…) # Query for items belonging in set B 

# setA and setB are QuerySets, ans as such does not query the database 
# until the data is actually needed. Thus you can just add further 
# delimitations. The below lines does the same thing, somewhat differently. 

complement = setB.objects.exclude(pk__in=[o.id for o in setA]) 
complement = setB.objects.exclude(pk__in=setA.values_list('pk', flat=True)) 

Comme vous pouvez le voir ce que vous devez faire est exclure de SetB tout objet qui est pk est dans la liste spécifiée. [o.id for o in setA] et setA.values_list('pk', flat=True) sont deux façons différentes de calculer une telle liste à partir des ensembles de requêtes créés précédemment (qui à la fois frappe la base de données afin de construire la liste, évidemment).

+0

ne fonctionne toujours pas :(ceci est mon code '
PersonalRecord_set = PersonalRecord.objects.filter (livre = current.book, id = I_D)
WordBase_set = WordBase.objects.filter (= appartiennent current.book)
new_words = WordBase_set.exclude (number__in = [o.number pour o dans PersonalRecord_set]) [: 1] 'Y at-il quelque chose que j'ai mal fait? – TianFuguang

+0

Oh, vous essayez de calculer un complément entre deux modèles différents (' PersonalRecord') et WordBase') Ma réponse, et la question liée, supposent qu'il s'agit de deux ensembles du même modèle.Il est difficile de dire sans regarder vos modèles, mais je suppose que l'exclusion devrait fonctionner quand même, étant donné qu'il y a des objets à l'intérieur Essayez d'exécuter les requêtes manuellement dans le [shell django] (https: //docs.djangoproje ct.com/fr/1.8/intro/tutorial01/#playing-with-the-api) et assurez-vous que les deux ensembles contiennent des objets. – Simon

+0

La requête génère-t-elle une erreur ou un ensemble inattendu? Est-ce que 'PersonalRecord' et' WordBase' ont tous les deux le champ numérique? – Simon