2017-03-05 10 views
0

Ich lerne Django und versuche, eine einfache Frage-Antwort-App zu erstellen, wo Benutzer auch die Fragen und/oder Antworten mögen können. Nun, was ich tun möchte, ist Spur, die eine bestimmte Frage gemocht/beantworten so habe ich ein separates Modell für die Verfolgung dieses wie folgt:Python Django Modelle Grundlagen

class Votes(models.Model): 
    answer_id = models.ForeignKey(Answers, related_name='likes_answers', null=True, default=None, db_column='answer_id') 
    question_id = models.ForeignKey(Questions, related_name='likes_questions', null=True, default=None, db_column='question_id') 
    likes_count = models.IntegerField(blank=True, default=0) 
    liked_by = models.ForeignKey(User, related_name='like_user', null=True, default=None, on_delete=models.CASCADE) 

Nun ist das Problem mit diesem Ansatz ist, dass jedes Mal eine Frage und eine Antwort Meinung ist uns wichtig Es wird einen Eintrag zu diesem Modell geben, der mehrere Einträge derselben Frage-ID oder Antwort-ID mit verschiedenen Benutzern erstellt. Obwohl die Benutzer unterschiedlich sind, aber eine Menge von answer_ids und question_ids wiederholt werden ... Ist das der richtige Ansatz oder kann ich es besser machen?

+0

Sie sie nicht nennen „answer_id“, sondern einfach „Antwort“. Django fügt automatisch den "_id" -Teil hinter den Kulissen hinzu. Nenne es auch nicht "miked_by", sondern "user" und den zugehörigen Namen "likes", also kannst du 'user.likes.all()' usw. machen. Das gleiche gilt für "answer" und "question". Schließlich sollte das Modell singular immer verwenden, also 'class Vote (models.Model)' und nicht "Votes". – C14L

+0

Danke für den Tipp @ C14L, ich werde mich darum kümmern. Ich habe question_id benutzt, weil ich mit django rest framework serializers arbeite und das möchte ich dem Client als Schlüssel in JSON schicken. Das heißt {{question_id}: }. Wenn ich eine Frage verwende, wird sie als {"question": } gesendet, was verwirrend ist. Gibt es eine Möglichkeit, bei der sich der Schlüssel in Serialisierern vom Feldnamen unterscheidet? –

+0

Ja, das ist der Fall und Sie sollten die "Benennung" für Ihre REST-API-Felder in DRF und nicht auf Datenbankebene vornehmen. – C14L

Antwort

1

Ich denke, ein besserer Ansatz wäre die Verwendung von Viele-zu-Viele-Feldern: Benutzer können mehrere Fragen/Antworten mögen, und Fragen/Antworten mögen von mehreren Benutzern gemocht werden.

Angenommen, Ihre Antwort einen Fremdschlüssel auf eine bestimmte Frage hat, wie dies die Modelle aussehen:

class Question(models.Model): 
    # .. other attributes 
    liked_by = models.ManyToManyField(User, related_name = 'liked_question') 

class Answer(models.Model): 
    question = models.ForeignKey(Question) 
    # .. other attributes 
    liked_by = models.ManyToManyField(User, related_name = 'liked_answer') 

alle Benutzer zu erhalten, die die Antwort gefallen hat, verwenden Sie

answer_object.liked_by.all() 

Für die (häufig verwendete) Likes zählen, würden Sie einfach verwenden

Viele-zu-viele Felder arbeiten die anderen er Weg, um auch so gerne durch einen Benutzer zu ermitteln, können Sie (dank der damit verbundenen Namen) verwenden

user_object.liked_question_set.all() 

user_object.liked_answer_set.all() 
+0

Vielen Dank @L Green. Das scheint definitiv ein besserer Ansatz zu sein! –

-1

Es ist keine Python, Django Frage, es ist eine RDBMS Design-Frage passen.

Aber um Ihre Frage zu beantworten,

Wenn Sie das Duplikat von der Abstimmung von Benutzern überprüfen mögen, dann ist es richtiger Ansatz.

Andere Vorgehensweise ist die Aktualisierung der Voting-Post-ID auf die Benutzertabelle. Es ist natürlich eine schlechte Herangehensweise.

+0

Danke @sayingu !! –