Ich bin sicher, dass sie eine ForeignKey (One to Many) -Beziehung im Tutorial verwendet haben, weil sie versuchten, das Beispiel so einfach wie möglich zu halten, mit nur zwei Modellen: Question
und Choice
. Beachten Sie, dass votes
ein Feld des Modells Choice
ist, mit dem die Ergebnisse der Umfrage sehr einfach dargestellt werden können.
Wenn Sie eine Umfrage durchgeführt haben, bei der Sie für jede Frage die gleiche Auswahl getroffen haben (Trifft voll und ganz zu, Stimmt ...), dann könnte eine ManyToMany-Beziehung angemessen sein. Aber das macht die Dinge komplizierter. Ihre vorgeschlagenen Modelle für eine ManyToMany-Beziehung waren:
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
choices = models.ManyToManyField(Choice)
class Choice(models.Model):
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
Aber das würde ohne einige Änderungen nicht richtig funktionieren. votes
ist immer noch ein Feld der Choice
Tabelle, aber jetzt gilt jede Auswahl für viele Fragen. Sie könnten sehen, dass die Wahl "Trifft voll und ganz zu" 38 Stimmen hat, aber Sie konnten nicht sagen, mit welchen Fragen die Wähler einverstanden waren. Um die Stimmen richtig tabellieren, würden Sie tun müssen, um so etwas wie
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
choices = models.ManyToManyField('Choice', through='QuestionChoices')
class Choice(models.Model):
choice_text = models.CharField(max_length=200)
class QuestionChoices(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice = models.ForeignKey(Choice, on_delete=models.CASCADE)
votes = models.IntegerField(default=0)
Jetzt können Sie tabellarisch genau, wie viele Menschen für jede Frage-Wahl Kombination gewählt, aber es ist komplizierter und nicht sehr geeignet für eine Einstiegs- -gestartetes Tutorial.
Mit den ManyToMany-Modellen, die Sie vorgeschlagen haben, würde Django automatisch das Modell QuestionChoices
hinter den Kulissen erstellen, aber um das Feld votes
daran anzufügen, müssen Sie es explizit selbst tun.
Wenn Sie eine Beziehung haben, die als OneToMany oder ManyToMany modelliert werden kann, hängen die Vor- und Nachteile von Ihrer speziellen Anwendung ab. Im Allgemeinen möchten Sie ein Modell verwenden, das die tatsächliche Situation am genauesten widerspiegelt. Sie müssen aber auch überlegen, wie Sie die Daten aktualisieren und zusammenfassen müssen und versuchen, den besten Kompromiss zu finden. Meiner Erfahrung nach gibt es nicht viele Situationen, in denen die Wahl schwierig ist.
Sie sind völlig unterschiedliche Dinge, Fremdschlüssel ist eine Eins-zu-viele-Beziehung. – Sayse
Ja, ich weiß. Aber warum wählen sie ForeignKey? Eine Frage hat viele Möglichkeiten und die gleiche Wahl könnte in vielen Fragen verwendet werden – somenxavier