Câu hỏi Mô hình Django và thuộc tính Python


Tôi đã cố gắng để thiết lập một mô hình Django với một tài sản python, như vậy:

class Post(models.Model):
    _summary = models.TextField(blank=True)
    body = models.TextField()

    @property
    def summary(self):
        if self._summary:
            return self._summary
        else:
            return self.body

    @summary.setter
    def summary(self, value):
        self._summary = value

    @summary.deleter
    def summary(self):
        self._summary = ''

Cho đến nay rất tốt, và trong giao diện điều khiển tôi có thể tương tác với các tài sản tóm tắt tốt. Nhưng khi tôi cố gắng làm bất cứ điều gì Django-y với điều này, như Post(title="foo", summary="bar"), nó ném phù hợp. Có cách nào để có được Django để chơi tốt đẹp với các thuộc tính Python?


9
2018-06-13 11:43


gốc


Đây là phương pháp chuẩn trong Python (docs.python.org/library/functions.html#property) - Tôi chỉ sử dụng kiểu trang trí thay vì gọi một cách rõ ràng property. - futuraprime
Ý bạn là Post(body="foo", summary="bar")? (lưu ý rằng body thay vì title). Điều này sẽ làm việc. - okm
@okm tôi đã khắc phục lỗi đánh máy đó. Nó thường nói Post(title="foo", summary="bar") đó là một lỗi đánh máy rõ ràng. - Buttons840


Các câu trả lời:


Thật không may, mô hình Django không chơi rất tốt đẹp với các thuộc tính Python. Cách nó hoạt động, ORM chỉ nhận ra tên của các thể hiện trường trong các bộ lọc QuerySet.

Bạn sẽ không thể tham khảo summary trong các bộ lọc của bạn, thay vào đó bạn sẽ phải sử dụng _summary. Điều này nhanh chóng thực sự lộn xộn, ví dụ để tham khảo trường này trong truy vấn nhiều bảng, bạn sẽ phải sử dụng một cái gì đó như

User.objects.filter(post___summary__contains="some string")

Xem https://code.djangoproject.com/ticket/3148 để biết thêm chi tiết về hỗ trợ tài sản.


12
2018-06-14 01:00



Bạn đã thử chưa Mật mã cho thấy rằng nó có thể chỉ định tài sản thông qua kwargs từ 5 năm trước ... - okm
Ồ, có vẻ như bạn đúng - nhà xây dựng không hỗ trợ tài sản; đây là để hỗ trợ GenericForeignKey. Tuy nhiên, đối số khác về QuerySets nắm giữ. - koniiiik