2016-06-08 5 views
-1

In django tutorial es eine Umfrage Struktur modelliert ist:Was ist das Für und Wider von ForeignKey statt ManyToManyField

from django.db import models 

class Question(models.Model): 
    question_text = models.CharField(max_length=200) 
    pub_date = models.DateTimeField('date published') 


class Choice(models.Model): 
    question = models.ForeignKey(Question, on_delete=models.CASCADE) 
    choice_text = models.CharField(max_length=200) 
    votes = models.IntegerField(default=0) 

aber ich frage mich immer, warum sie wie ManyToMany Beziehung nicht implementieren:

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) 

Was sind die Vor- und Nachteile?

+3

Sie sind völlig unterschiedliche Dinge, Fremdschlüssel ist eine Eins-zu-viele-Beziehung. – Sayse

+0

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

Antwort

1

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.

+0

vielen Dank. Es ist eine sehr detaillierte Beschreibung von Theorie und praktischen Fragen – somenxavier

Verwandte Themen