2012-12-20 27 views
16

Tôi có đoạn mã sau:Làm thế nào để có hai mô hình tham khảo mỗi Django khác

class Game(models.Model): 
    title = models.CharField(max_length=50) 
    summery = models.CharField(max_length=500) 
    key = models.IntegerField() 
    pin = models.CharField(max_length=12) 
    complete = models.BooleanField() 
    invite_sent = models.DateTimeField() 
    on = models.ForeignKey(Member, blank = True) #<---- 


class Member(models.Model): 
    email = models.CharField(max_length=100) 
    color = models.CharField(max_length=11) 
    game = models.ForeignKey(Game) #<---- 

Các "trên" liên kết chính nước ngoài để một trong những thành viên (ai là tắt nó là). Tất cả các thành viên của trò chơi đều có khóa trò chơi "trò chơi" của họ được đặt cho trò chơi mà họ đang chơi. Vấn đề là Django sẽ không để tôi tham khảo một lớp trước khi nó được khai báo, và vì tôi không thể khai báo chúng cùng lúc ...

Chỉnh sửa: Để làm rõ mọi thứ, đây là một ví dụ. Nếu có năm thành viên chơi một trò chơi, cả năm người đều có chìa khóa nước ngoài cho trò chơi. Các trò chơi mặt khác sẽ có một chìa khóa nước ngoài cho các thành viên cụ thể của những người biến nó được.

+3

Có thể không thích hợp ở đây, nhưng nói chung, bạn có thể tạo một ForeignKey đến một lớp học mà bạn chưa được khai báo bằng cách thông qua tên của lớp như là một chuỗi thay vì chính lớp đó. – mipadi

Trả lời

29

Các Django documentation for the ForeignKey field trạng thái:

Nếu bạn cần để tạo ra một mối quan hệ trên một mô hình mà vẫn chưa được xác định, bạn có thể sử dụng tên của các mô hình, chứ không phải là đối tượng mô hình riêng của mình.

Vì vậy, trong trường hợp của bạn, đó sẽ là:

class Game(models.Model): 
    # Other fields... 
    on = models.ForeignKey('Member', blank = True) 

class Member(models.Model): 
    # Other fields... 
    game = models.ForeignKey(Game) 
+2

Với tôi, liên tục sử dụng ký hiệu ''app.model'' cho' ForeignKey', 'OneToOneField' và' ManyToManyField' là thực hành rất tốt. Tôi đã sử dụng điều này để chia các tệp mô hình thành một tệp cho mỗi mô hình, điều này dễ đọc hơn nhiều. –

+0

@SteveK Điều này đã giúp tôi giải quyết vấn đề nhập vòng tròn, cảm ơn! – OrPo

+0

Bạn sẽ làm thế nào để tiết kiệm mối quan hệ này với các đối số mặc định 'null = False'? – jozxyqk

8

Bạn không cần phải có hai mô hình tham chiếu lẫn nhau bằng khóa ngoài. Hủy bỏ các dòng:

on = models.ForeignKey(Member, blank = True) #<---- 

và logic Member của bạn 's vẫn sẽ được liên kết với nhau Game' s (và điều này có ý nghĩa hơn vì một thành viên có thể thuộc về một trò chơi cùng một lúc, trong khi một trò chơi có thể có nhiều hơn một thành viên).

Bạn có thể sử dụng reverse relation để tìm ra thành viên nào đang chơi trên một trò chơi cụ thể.

+1

Tôi có thể xảy ra đã không làm cho tình hình của tôi rõ ràng (hoặc có thể tôi không hiểu câu trả lời của bạn). Nếu bạn đã có cho instants 5 thành viên tất cả chơi một trò chơi, tất cả họ sẽ tham khảo cùng một trò chơi. Nhưng khóa ngoại ngữ "on" sẽ chỉ đề cập đến những người lần lượt là (một thành viên). –

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