Bạn có thể thực hiện một chức năng để kiểm tra xem các ví dụ Listing
có ít nhất một trường hợp hình ảnh, và kết nối chức năng đó đến Listing
mô hình của pre_save signal
Nó sẽ có một cái gì đó như thế nào, (giả sử bạn đang sử dụng django 1.3)
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import Listing
...
@receiver(pre_save, sender=Listing)
def check_image_requirement(sender, instance, **kwargs):
if instance.images.count() == 0:
raise your_own_exception("Listing is required to have at least one image")
nơi bạn cần phải thực hiện your_own_exception
việc bổ sung sau đây là câu trả lời cho những câu hỏi thêm PO của
Triển khai Listing.clean()
là một cách khác để đạt được cùng một quy tắc xác thực. Thật vậy, đó là cách tiếp cận ngữ nghĩa chính xác như Model.clean()
có nghĩa là để xác nhận mô hình tùy chỉnh. Nhưng việc áp dụng cách tiếp cận này sẽ ít thuận tiện hơn - để kích hoạt clean()
bạn sẽ phải gọi thủ công full_clean()
(nếu bạn không sử dụng mẫu biểu mẫu) hoặc gọi theo cách thủ công is_valid()
(khi sử dụng mẫu biểu mẫu), ngay trước khi gọi save()
của Danh sách ví dụ. Reference
Mặt khác, với cách tiếp cận tín hiệu pre_save
, bạn có thể chắc chắn rằng quy tắc xác thực luôn được áp dụng trên Listing
dụ bất cứ khi nào bạn gọi save()
trên cá thể.
Nó không phải là một quyền hoặc sai để chọn một trong những khác, nhưng chỉ là một quyết định thiết kế để thực hiện. Cả hai cách tiếp cận đều có thể đạt được những gì bạn cần và giữ logic nghiệp vụ/miền (ví dụ: quy tắc xác thực của bạn) trong lớp Mô hình.
Bạn có ý gì bằng cách đảm bảo? Ngăn chặn lưu trừ khi có số lượng hình ảnh yêu cầu? –
Có, đảm bảo có ít nhất một món quà (và nếu có thể có tối đa) – RS7
Bạn có cần nó để lọc danh sách hoặc ở nơi khác không? Trong khi lọc, bạn có thể sử dụng chú thích và bộ lọc theo số kết quả. – ilvar