Модели Django One-To-Many

Следующие модели описывают уязвимость и URL-адреса в Интернете, которые ссылаются на эту уязвимость. Предположим, что каждый URL-адрес говорит только об одной уязвимости, и эта уязвимость будет обсуждаться во многих URL-адресах. Это правильный способ выложить модель?

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)

Приложение администратора предоставляет поле «выбрать» для ссылочных URL-адресов, а это не то, что мне нужно. Когда я добавляю новый объект уязвимости, все существующие URL-адреса, которые были введены, отображаются в этом раскрывающемся списке, что опять же неестественно. Я чувствую, что это должно вести себя очень похоже на то, как будет вести себя комментарий в блоге, т.е. комментарий относится к одной записи в блоге и ни к какой другой, и эта запись в блоге может иметь много комментариев. Как мне выразить это в модели Django?


person Dan    schedule 11.01.2010    source источник
comment
Кроме того, из соображений стиля было бы лучше использовать Vulnerability в качестве имени таблицы, а не Vuln - это длиннее, но, по крайней мере, вы не думаете, что, черт возьми, это уязвимость, как я, когда вы это видите.   -  person LeafStorm    schedule 11.01.2010


Ответы (1)


Это должно быть больше похоже на это:

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)

Если вы говорите, что каждый URL-адрес говорит о конкретной уязвимости, то это относится к Django DBM :)

Что касается поля поставщика, вы просто добавляете еще один класс, как Class Vuln. Например:

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

Надеюсь это поможет! С уважением, Алекс

person Alex    schedule 11.01.2010