2009-11-25 16 views
9

Đây là mô hình cơ sở dữ liệu Django đơn giản của tôi. Nó dành cho hệ thống xếp hạng 5 sao.Làm thế nào để làm cho độc đáo trong mô hình Django? Và cũng lập chỉ mục một cột ở Django

class Rating(models.Model): 
    content = models.OneToOneField(Content, primary_key=True) 
    ip = models.CharField(max_length=200, blank=True) 
    rating = models.IntegerField(default=0) 

Như bạn thấy, nó được liên kết với "Nội dung", là bảng cho tài liệu của tôi. Câu hỏi của tôi là:

  • Làm thế nào để làm cho nội dung + ip độc đáo ... nên rằng nó nhiều nội dung không quan trọng, nhưng nhiều nội dung VÀ IP là không ổn (không muốn người sử dụng để đánh giá hai lần).
  • Làm cách nào để tạo chỉ mục cơ sở dữ liệu cho nội dung và ip ... vì tôi sẽ luôn chọn những thứ đó (để so sánh nếu nó đã có trong cơ sở dữ liệu).
+0

Tại sao sử dụng 'CharField()' cho IP thay vì 'IPAddressField()'? – Surya

Trả lời

13

Về câu hỏi đầu tiên: Bạn nên xem unique_together vì điều này có thể giải quyết được sự cố của bạn.

class Rating(models.Model): 
    content = models.OneToOneField(Content, primary_key=True) 
    ip = models.CharField(max_length=200, blank=True) 
    rating = models.IntegerField(default=0) 

    class Meta: 
     unique_together= (('content', 'ip'),) 
+1

có thể tốt hơn để chuyển đổi IP thành 'int' trước khi lưu trữ và sử dụng' IntegerField'. nó sẽ sử dụng không gian ít hơn (im không chắc chắn lý do tại sao bạn đã phân bổ 200 byte cho một địa chỉ IP), và cho phép truy vấn linh hoạt hơn. bạn cũng có thể muốn xem 'xếp hạng django' (http://github.com/dcramer/django-ratings), xử lý cả phiếu bầu ẩn danh và được xác thực rất tốt. – Carson

5

Giới thiệu về chỉ mục: bạn không cần phải làm bất kỳ điều gì cho content, vì đây là khóa chính, nó sẽ được lập chỉ mục. Đối với ip, chỉ cần thêm db_index=True cuộc gọi CharField constructor:

ip = models.CharField(max_length=200, blank=True, db_index=True) 

Thông tin thêm về db_index và lĩnh vực khác tùy chọn here

+1

Lập chỉ mục trường thứ hai sẽ không làm cho trường đó trở thành duy nhất với khóa chính. – hughdbrown

+3

Tôi không trả lời câu hỏi về đồ cổ. Dấu đầu dòng thứ hai trong câu hỏi hỏi về lập chỉ mục ip. –

7

BTW, nếu như nó xuất hiện từ ngữ của bạn, bạn đang sử dụng địa chỉ IP như đứng cho danh tính của người dùng, xin vui lòng không - đó là một ý tưởng nghiêm túc khủng khiếp. Người dùng đến thông qua ISP của họ sẽ nhận được IP của họ thay đổi vào những thời điểm ngẫu nhiên, vì vậy họ có thể bỏ phiếu hai lần; người dùng trên máy tính xách tay kết nối tại các cửa hàng cà phê, thư viện khác nhau, & c, sẽ có các IP luôn thay đổi; người dùng chia sẻ kết nối (ví dụ, chung cư), hoặc thậm chí mỗi người dùng duy nhất đến từ một trường đại học, có thể có cùng địa chỉ IP thông qua NAT, vì vậy chỉ có một người có thể bỏ phiếu ... thật khó để nghĩ -)

Nếu bạn sử dụng tên ip cho trường "nhận dạng người dùng" của bạn là ngẫu nhiên và không liên quan gì đến việc sử dụng địa chỉ IP ở đó, tôi xin lỗi, nhưng trong trường hợp đó ! hãy làm đổi tên trường -)

+0

Ý tưởng thay thế là sử dụng cookie hoặc LocalStorage. – Josh

0

Vui lòng thử từ khóa này Metha: "unique_together"

class PowerBoardSwitches(models.Model): 
     id = models.AutoField(primary_key=True, verbose_name='Switch id') 
     powerBoardId = models.ForeignKey(PowerBoardDevice, models.DO_NOTHING, db_column='powerBoardId', verbose_name='Power Board Id') 
     powerBoardSwitchId = models.IntegerField() 
     powerBoardSwitchStatus = models.IntegerField() 
     createdOn = models.DateTimeField(auto_now_add=True, verbose_name='Created on date') 
     updatedOn = models.DateTimeField(auto_now_add=True, verbose_name='Updated on date') 

     class Meta: 
      unique_together = (('powerBoardId', 'powerBoardSwitchId'),) 
Các vấn đề liên quan