django: La selezione di domande che non è stato chiesto
Domanda
Sto creando piccola applicazione Django che detiene alcune alcune domande (e risposte per loro)
Quello che voglio fare è quello di mostrare all'utente domanda a caso, ma solo da quelli che non è stato ancora risolto da lui. Mi chiedo come fare questo.
Per il momento, ho definito il profilo utente modello in questo modo:
class UserProfile(models.Model):
rank = models.IntegerField(default = 1)
solvedQ = models.ManyToManyField(Question)
user = models.ForeignKey(User, unique=True)
Quindi i problemi risolti sono aggiunti in questo modo:
if user.is_authenticated():
profile = user.get_profile()
profile.rank += 1
profile.solvedQ.add(Question.objects.get(id=id))
Ora, se la vista deve mostrare domanda a caso, ma non dalla lista già risolto ...
C'è un buon modo per intersecare Domande e solvedQuestions .... così domanda viene scelto dalla lista irrisolto?
Soluzione
ManyToMany rapporti sono automaticamente simmetriche in Django ... http://docs.djangoproject.com/en/1.1/topics/db/models/#many-to-many-relationships
Esegui una query dal modello domanda
Senza vedere il vostro modello quesion, suppongo che finirà per qualcosa di simile:
possible_questions = Questions.objects.filter(~(UserProfile=profile))
I credo che query darà i tutti i risultati in cui l'utente relativo alla domanda non corrisponde l'utente corrente. Io non sono molto familiare con l'esecuzione di "non" query. Una ricerca rapida mi ha detto che il '~' lo farà, ma si dovrebbe poi controllare.
Quindi, si può semplicemente prendere uno a caso dal set di query restituito.
** Modifica **
Sembra che si può afferrare il diritto casuale nella query facendo qualcosa di simile:
possible_questions = Questions.objects.filter(~(UserProfile=profile)).order_by('?')
Poi basta utilizzare il primo restituito.