2010-01-11 8 views
11

Los siguientes modelos describen una vulnerabilidad y las URLs en Internet que hacen referencia a esa vulnerabilidad. Supongamos que cada URL solo habla de 1 vulnerabilidad, y que muchas URL analizarán esa vulnerabilidad. ¿Es esta la manera correcta de diseñar el modelo?Django One-To-Many Models

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) 

La aplicación de administración ofrece un cuadro de "selección" para las URL de referencia, que no es lo que quiero. Cuando agrego un nuevo objeto de vulnerabilidad, todas las URL existentes que se han ingresado aparecen en ese menú desplegable, que de nuevo no es natural. Siento que esto debería comportarse de manera muy similar a como lo haría un comentario en un blog, es decir. el comentario se aplica a una sola entrada de blog y a ninguna otra y esa entrada de blog puede tener muchos comentarios. ¿Cómo expreso esto en un modelo de Django?

+14

Además, como una cuestión de estilo, sería mejor usar 'Vulnerabilidad' como nombre de tabla, en lugar de' Vuln' - es más largo, pero al menos no piensas "¿Qué demonios? es un vuln "como lo hice cuando lo ves". – LeafStorm

Respuesta

23

Debería ser de la misma familia:

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) 

Si usted está diciendo cada URL habla de una vulnerabilidad específica, entonces no es su relación en el Django DBM :)

En cuanto al proveedor campo, simplemente agrega otra clase, al igual que Class Vuln. Por ejemplo:

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

Espero que esto ayude! Saludos, Alex

Cuestiones relacionadas