Je fais une petite application quiz de vocabulaire, et le modèle de base pour un mot est ceci:django QuerySet entrées à l'exception de deuxième modèle
class Word(models.Model):
id = models.AutoField(primary_key=True)
word = models.CharField(max_length=80)
id_image = models.ForeignKey(Image)
def __unicode__(self):
return self.word
class Meta:
db_table = u'word'
Le modèle des mots que je suis en train de me questionnant sur est cela:
class WordToWorkOn(models.Model):
id = models.AutoField(primary_key=True)
id_student = models.ForeignKey(Student)
id_word = models.ForeignKey(Word)
level = models.IntegerField()
def __unicode__(self):
return u'%s %s' % (self.id_word.__unicode__(), self.id_student.__unicode__())
class Meta:
db_table = u'word_to_work_on'
Où "niveau" indique à quel point je l'ai appris. L'ensemble des mots que je l'ai déjà appris a ce modèle:
class WordLearned(models.Model):
id = models.AutoField(primary_key=True)
id_word = models.ForeignKey(Word, related_name='word_to_learn')
id_student = models.ForeignKey(Student, related_name='student_learning_word')
def __unicode__(self):
return u'%s %s' % (self.id_word.__unicode__(), self.id_student.__unicode__())
class Meta:
db_table = u'word_learned'
Lorsqu'un queryset sur WordToWorkOn revient avec des résultats trop peu (parce qu'ils ont été appris assez bien pour se déplacer dans WordLearned et supprimé de WordToWorkOn), Je veux trouver un mot à ajouter. La partie que je ne connais pas un bon moyen est de la limiter aux mots qui ne sont pas déjà dans WordLearned. Donc, de manière générale, je pense que je veux faire un .exclude() de quelque sorte sur un jeu de mots, mais il doit être exclu en fonction de l'appartenance à la table WordLearned. Y at-il un bon moyen de le faire? Je trouve beaucoup de références à se joindre à des jeux de requêtes, mais je n'ai pas trouvé de bonne façon de le faire (je ne connais probablement pas le bon terme à rechercher). Je ne veux pas simplement utiliser un drapeau sur chaque mot pour indiquer appris, travailler dessus, ou pas appris, parce que finalement ce sera une application multi-utilisateur et je ne voudrais pas avoir de drapeaux pour chaque utilisateur. Par conséquent, je pensais que plusieurs tables pour chaque ensemble serait mieux.
Tous les conseils sont appréciés.
Wow, trois leçons dans un. Je vais réorganiser ma structure de données en conséquence et revenir à vérifier cette réponse comme correcte une fois que je l'ai effectivement mis en œuvre (pas que j'en doute vraiment, juste par principe). Merci pour votre aide. – rossdavidh
Belle solution, mais comment vous ne pouvez pas prendre des objets Word, ce qui ne sont pas dans la table StudentWord? – inoks
Voici également un bug dans la fonction d'exclusion, il n'est donc pas possible de l'utiliser pour filtrer par 2 champs et plus. https://code.djangoproject.com/ticket/14645 – inoks