2017-11-22 3 views
0

Ich entwerfe ein Modell, eine Ansicht und eine Vorlage für meine News Aggregation App. Ich möchte, dass die Vorlage dem Benutzer ein Multiple-Choice-Formular mit Optionen aus der Datenbank anbietet. Wie gestalte ich das in meinem Modell?Django Multiple-Choice-Feld von Optionen in der Datenbank

Ich habe die Django-Dokumentation über ManyToManyField (die mit Journalisten und Artikeln) gelesen, aber ich denke nicht, dass das die richtige Beziehung ist, denn in meinem Fall können "Artikel" ohne einen Journalisten und Journalisten ohne einen Artikel existieren .

Ich habe Benutzer. Ich habe Streams. Streams ist eine Sammlung von News-Sites, die ein Nutzer abonnieren kann, um aggregierte Headline-Snippets zu sehen, z. B. von CNN, Twitter, Google News usw. Ein Stream kann ohne Nutzer existieren. Ein Stream kann viele Benutzer haben. Ein Benutzer kann keine Streams haben, tatsächlich starten alle Benutzerkonten in meiner App ohne Streams, bis sie eines auswählen. Ein Benutzer kann viele Streams haben.

In der Vorlage möchte ich ein Formular mit der Liste aller Stream-Optionen in der Datenbank erstellen (dies wird sich wahrscheinlich ändern, wenn ich in der Zukunft mehr Optionen anzeigen werde). Wenn ein Benutzer einen Stream auswählt, wird er der Dashboard-Ansicht hinzugefügt. Sie können Streams hinzufügen und löschen. Allerdings gibt es nur 1 Twitter, 1 Google News, etc. Quelle. Ich kann die typische Auswahloption im Benutzermodell nicht verwenden, ich möchte, dass sie "dynamisch" ist und direkt aus der Streams-Datenbank abgerufen wird.

Das ist, was ich habe jetzt aber ich weiß, es ist nicht richtig:

streams/models.py

from django.db import models 
from django.contrib.auth.models import User 


class Stream(models.Model): 
    user = models.ManyToManyField(User, blank=True, null=True) 
    name = models.CharField(max_length=30) 

Benutzer/models.py

from django.db import models 


class User(models.Model): 
    name = models.CharField(max_length=30) 

    ''''' 
    #TODO: make this dynamic, streams is pulling from Streams model 
     streams = (
      ('Google News'), 
      ('Yahoo News'), 
      ('Twitter'), 
      ('CNN'), 
      ('New York Times'), 
      ('NBC News'), 
      ('Huffington Post') 
     ) 
     stream_choices = models.CharField(max_length=9, choices=streams) 


    ''''' 

Antwort

0

Nur fügen Sie ein Modell für die Liste der Streams und ein weiteres Modell für die vom Benutzer ausgewählten Streams hinzu

class Stream(models.Model): 
    name = models.CharField(max_length=50) 

class UserStream(models.Model): 
    user = models.ForeignKey(User) 
    name = models.ForeignKey(Stream) 

Das ist es. Fügen Sie mögliche Streams zu Stream Modell und Benutzer ausgewählten Streams zu UserStream Modell.

+0

Ah! Ich sehe, ein Zwischentisch! Vielen Dank. – cssidy

0

Die ManyToManyField erstellt bereits implizit die 'intermediate table', die in der akzeptierten Antwort beschrieben wird. Gemäß der Dokumentation:

Hinter den Kulissen erstellt Django eine Zwischenjoin-Tabelle, die die Viele-zu-Viele-Beziehung darstellt.

Sie können eine aufrufbare zum choices Feld der ChoicesField passieren, die Sie den Benutzer angezeigt werden, so dass die Liste der verfügbaren Optionen dynamisch festgelegt werden, wenn die Form erzeugt wird.

Die Liste der gültigen Auswahlmöglichkeiten in der Benutzer < -> Stream-Beziehung ist bereits durch die Beziehung eingeschränkt. Daher ist es nicht sinnvoll, die verfügbaren Auswahlmöglichkeiten im Modellfeld anzugeben.