2012-03-07 19 views
8

Làm cách nào để đảm bảo rằng ít nhất một trong nhiều mối quan hệ được thiết lập?Mô hình Django - ít nhất một trong nhiều đối với nhiều người

Ví dụ: Nếu tôi có mô hình listing có một trường hình ảnh có liên quan nhiều đến images. Làm cách nào tôi có thể đảm bảo rằng ít nhất một hình ảnh được đặt là

Câu hỏi tiền thưởng: Điều gì sẽ xảy ra nếu tối thiểu là một hình ảnh khác không? Điều gì về tối đa?

+3

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? –

+0

Có, đảm bảo có ít nhất một món quà (và nếu có thể có tối đa) – RS7

+0

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

Trả lời

3

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.

+0

tôi m khá mới với phython/django. Là pre_save chạy trước khi xác nhận trường (trước khi đảm bảo ví dụ rằng một trường số nguyên là số nguyên, hoặc một ràng buộc khóa nước ngoài phù hợp)? Tại sao pre_save và không sạch()? Khi sử dụng tính năng xác nhận trường thừa(), tôi có ghi đè hoặc mở rộng trường không? Cảm ơn đã giúp đỡ! – RS7

+0

@ RS7 - Không phải lo lắng. Mọi người đều ở đây để học hỏi, kể cả bản thân tôi. Tôi đã thêm vào câu trả lời của tôi để trả lời các câu hỏi khác của bạn. – tamakisquare

+0

Cảm ơn, rất nhiều thông tin - câu hỏi cuối cùng: Nếu mô hình 'liệt kê' có nhiều hình ảnh được đại diện bởi mô hình' hình ảnh'. Nếu tôi hiểu các tài liệu một cách chính xác, thay vì một trường nhiều 'hình ảnh', tôi sẽ tạo ra một mô hình riêng biệt có? Vì vậy, để kiểm tra nếu tối thiểu được đáp ứng, tôi muốn truy cập nó theo cùng một cách? 'self.image.count()' nếu tôi đang làm trong 'clean()'? – RS7

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