2012-01-21 43 views
8

Tôi đang cố gắng tìm ra cách bố trí hai mô hình Django để khi một mô hình mới được lưu vào cơ sở dữ liệu, khóa chính của nó được tăng lên sao cho nó giá trị cao nhất tiếp theo cho tất cả các bản ghi có cùng khóa ngoại.Django Model Auto Increment Primary Key Dựa trên khóa ngoài

Nó giống như this question asked, nhưng tôi tự hỏi làm thế nào bạn sẽ làm điều đó trong Django. Dưới đây là một đoạn trích từ câu hỏi đó chứng tỏ một tình huống tương tự:

id | job_id | title 
0  1  hi 
1  1  hello 
2  1  goodbye 
0  2  hi 
1  2  hello 

Tôi biết you can't have multiple primary keys in a Django model và bạn có thể sử dụng unique_together, nhưng các tài liệu nói nó sử dụng UNIQUE tuyên bố tương đương trong CREATE báo cáo. Có phải

class ModelA(models.Model): 
    key = models.PositiveIntegerField(primary_key = True) 
    fk = models.ForeignKey(ModelB) 

    def Meta(self): 
     unique_together = ("key", "fk") 

trong các mô hình hoạt động với this answer để hoàn thành những gì tôi đang tìm? Mối quan hệ giữa các mô hình là một ModelA có nhiều ModelB s, nhưng mỗi ModelB chỉ có một ModelA.

+1

Đoạn đầu tiên không phân tích cú pháp. –

+0

@ IgnacioVazquez-Abrams, tôi rephrased đoạn đầu tiên và thêm một ví dụ. Bây giờ nó có ý nghĩa hơn không? – Dirk

Trả lời

8

Dirk, bạn phải thực hiện một số thay đổi đối với mô hình (nếu được phép) là Ignacio đã cho biết. Vì vậy, ModelA bây giờ sẽ trông giống như sau.

class ModelA(models.Model): 
    key = models.PositiveIntegerField() 
    fk = models.ForeignKey(ModelB) 

    def Meta(self): 
     unique_together = ("key", "fk") 

    def save(self, *args, **kwargs): 
     key = cal_key(self.fk) 
     self.key = key 
     super(ModelA, self).save(*args, **kwargs) 

As, bạn có thể thấy, tôi có overridden the default save method để tính giá trị quan trọng từ một phương pháp cal_key tham fk as argument. Vì vậy, hãy xác định phương thức cal_key sau bên dưới trong tệp mô hình.

def cal_key(fk): 
    present_keys = ModelA.objects.filter(fk=fk).order_by('-key').values_list('key',flat=True) 
    if present_keys: 
     return present_keys[0]+1 
    else: 
     return 0 

Phương pháp cal_key chỉ rõ những gì bạn thực sự yêu cầu.

+0

Cảm ơn Sandip. Tôi đã đi với câu trả lời của bạn bởi vì nó đã được di động hơn so với câu trả lời của Ignacio. – Dirk

+0

Nếu ứng dụng của bạn là đa luồng, có khả năng là giải pháp này có thể làm tăng lỗi xác thực unique_together vì nó cố gắng phân bổ cùng một khóa cho hai tính năng khác nhau, nếu chúng được lưu cùng một lúc không? –

0

bạn có thể thử này:

AutoFile 

bạn có thể tìm here để biết chi tiết.

Các vấn đề liên quan