Tôi khuyên bạn nên sửa đổi thiết kế của mình để bao gồm một số trường trạng thái trên A.
Vấn đề là một trong những lý do "tại sao?" Tại sao A có < 2 B và tại sao A có> = 2 B. Có phải vì người dùng không nhập gì đó? Hoặc là bởi vì họ đã cố gắng và đầu vào của họ có lỗi. Hoặc là vì quy tắc < 2 không áp dụng trong trường hợp này.
Sử dụng sự hiện diện hoặc vắng mặt của Khóa ngoại quốc giới hạn ý nghĩa - hiện tại hoặc vắng mặt. Bạn không có cách nào để đại diện cho "tại sao?"
Ngoài ra, bạn có tùy chọn sau
[ a for a in A.objects.all() if a.b_set.count() < 2 ]
Điều này có thể đắt tiền vì nó lấy tất cả của hơn buộc các cơ sở dữ liệu để làm việc A.
Chỉnh sửa: Từ nhận xét "sẽ yêu cầu tôi xem người dùng tham gia/người dùng rời khỏi sự kiện hồ bơi".
Bạn không "xem" bất cứ điều gì - bạn cung cấp API làm những gì bạn cần. Đó là lợi ích trung tâm của mô hình Django. Dưới đây là một cách, với phương pháp khám phá trong lớp A
.
class A(models.Model):
....
def addB(self, b):
self.b_set.add(b)
self.changeFlags()
def removeB(self, b):
self.b_set.remove(b)
self.changeFlags()
def changeFlags(self):
if self.b_set.count() < 2: self.show= NotYet
else: self.show= ShowNow
Bạn cũng có thể định nghĩa một Manager
đặc biệt cho điều này, và thay thế Manager mặc định b_set
với người quản lý của bạn mà đếm tài liệu tham khảo và cập nhật A
.
Nguồn
2008-11-03 11:00:13
Giải pháp quá phức tạp, trong khi Django có tính năng chú thích. –