2010-01-11 38 views
11

Các mô hình sau mô tả lỗ hổng và các URL trên internet tham chiếu đến lỗ hổng đó. Giả sử rằng mỗi URL chỉ bao giờ nói về 1 lỗ hổng và nhiều URL sẽ thảo luận về lỗ hổng đó. Đây có phải là cách chính xác để đặt ra mô hình?Mô hình một-nhiều-nhiều Django

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) 

Ứng dụng quản trị cung cấp hộp 'chọn' cho URL tham chiếu, không phải những gì tôi muốn. Khi tôi thêm đối tượng dễ bị tổn thương mới, tất cả các URL hiện tại đã được nhập sẽ hiển thị trong trình đơn thả xuống đó, một lần nữa lại không tự nhiên. Tôi cảm thấy như thế này nên hành xử rất giống với cách một bình luận blog, tức là. nhận xét áp dụng cho một mục nhập blog duy nhất và không có mục nào khác và một mục nhập blog có thể có nhiều nhận xét. Làm thế nào để thể hiện điều này trong một mô hình Django?

+14

Ngoài ra, như là một vấn đề về phong cách, sẽ tốt hơn nếu sử dụng 'Vulnerability' làm tên bảng, thay vì 'Vuln' - dài hơn, nhưng ít nhất bạn không nghĩ" Cái quái gì là một điều thô tục "giống như tôi đã làm khi bạn nhìn thấy nó. – LeafStorm

Trả lời

23

Nó nên được nhiều như thế này:

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) 

Nếu bạn đang nói mỗi Url cuộc đàm phán về một lỗ hổng cụ thể, sau đó là mối quan hệ của bạn trong Django DBM :)

Đối với các nhà cung cấp , bạn chỉ cần thêm một lớp khác, giống như Class Vuln. Ví dụ:

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

Hy vọng điều này sẽ hữu ích! Kính trọng, Alex