2010-01-11 12 views
11

Die folgenden Modelle beschreiben eine Sicherheitsanfälligkeit und die URLs im Internet, die auf diese Sicherheitsanfälligkeit verweisen. Angenommen, jede URL redet immer nur von einer Schwachstelle und viele URLs sprechen über diese Schwachstelle. Ist das der richtige Weg, das Modell zu entwerfen?Django One-to-Many-Modelle

class Vuln(models.Model): 
    pub_date = models.DateTimeField("Publication Date") 
    short_description = models.CharField("Description", max_length=70) 

    reference_urls = models.ForeignKey(Url, unique=True, blank=True, verbose_name="Reference URLs") 
    vendor = models.ForeignKey(Vendor, verbose_name="Vendor") 

class Url(models.Model): 
    url = models.URLField("URL", max_length=200) 

Die Admin-Anwendung gibt eine ‚wählen Sie‘ Feld für die Referenz URLs, die nicht das, was ich will. Wenn ich ein neues Sicherheitsanfälligkeitsobjekt hinzufüge, werden alle vorhandenen URLs in dieser Dropdown-Liste angezeigt, was wiederum unnatürlich ist. Ich denke, das sollte sich sehr ähnlich verhalten wie ein Blogkommentar, d. Der Kommentar gilt für einen einzelnen Blogeintrag und kein anderer und dieser Blogeintrag kann viele Kommentare enthalten. Wie drücke ich dies in einem Django-Modell aus?

+14

Auch wäre es besser, 'Vulnerability' als Tabellenname zu verwenden, anstatt' Vuln' - es ist länger, aber zumindest denkt man nicht "Was zum Teufel ist ein vuln "wie ich es tat, wenn du es siehst. – LeafStorm

Antwort

23

Es sollte mehr so ​​aussehen:

class Vuln(models.Model): 
    pub_date = models.DateTimeField("Publication Date") 
    short_description = models.CharField("Description", max_length=70) 
    vendor = models.ForeignKey(Vendor, verbose_name="Vendor") 

class Url(models.Model): 
    url = models.URLField("URL", max_length=200) 
    vulnerability = models.ForeignKey(Vuln) 

Wenn Sie jede URL Gespräche über eine bestimmte Schwachstelle da sagen, dann gibt Ihre Beziehung in Django DBM ist :)

Wie für den Verkäufer Feld, fügen Sie einfach eine andere Klasse hinzu, ähnlich wie Class Vuln. Zum Beispiel:

class Vendor(models.Model): 
    field_names_go_here = models.TextField(max_length=70) 
    short_description = models.CharField("Description", max_length=70) 

Hoffe, das hilft! Grüße, Alex

Verwandte Themen