2010-04-02 27 views
5

Tôi có một mô hình:Làm cách nào để tạo trường mô hình Django được tính khi chạy?

class Person (models.Model): 
    name  = models.CharField() 
    birthday = models.DateField() 
    age  = models.IntegerField() 

Tôi muốn làm age lĩnh vực để hành xử như một tài sản:

def get_age (self): 
     return (datetime.datetime.now() - self.birthday).days // 365 

    age = property (get_age) 

nhưng đồng thời tôi cần age trở thành một lĩnh vực thực sự, vì vậy tôi có thể tìm thấy nó trong Person._meta.fields và chỉ định các thuộc tính cho nó: age.help_text = "Age of the person", v.v.

Rõ ràng tôi không thể chỉ ghi đè Person.save() phương pháp để tính và lưu trữ age trong cơ sở dữ liệu, bởi vì nó chắc chắn sẽ trở thành sai sau này (trên thực tế, nó không nên được lưu trữ trong cơ sở dữ liệu ở tất cả).

Thực ra, tôi không cần phải có bộ định giờ, nhưng giải pháp tốt nhất phải có tính năng cài đặt.

Có thể ở Django, hoặc có thể có cách tiếp cận pythonic và djangoic hơn cho vấn đề của tôi?

+0

Tại sao sẽ ghi đè phương pháp lưu không hoạt động? –

+0

Bởi vì nó có thể là sai thời gian tới, chúng tôi nhận được một ví dụ mô hình. Đây là một ví dụ đơn giản, tôi thực sự có các trường phức tạp hơn, có giá trị thay đổi không thể đoán trước, phụ thuộc vào một số yếu tố khác. –

Trả lời

3

bạn sắp thực hiện theo cách lạ. bạn chỉ cần lưu trữ ngày sinh (mà bạn đã làm).

nếu bạn cần thực hiện truy vấn dựa trên độ tuổi, lấy độ tuổi và sau đó tìm kiếm vào ngày sinh phù hợp với yêu cầu.

from datetime import datetime 

# get people over 50 
age = 50 # in years 
age_ago = datetime.now() - age # use timedelta i don't know the syntax off the top of my head 
Person.objects.filter(birthday__lte=age_ago) # people whose birthday is before fifty years ago 

bạn nói điều đó cho mình "[tuổi] không nên được lưu trữ trong cơ sở dữ liệu ở tất cả các"

bạn nói đúng. không có lý do gì để có trường tuổi ... chỉ là tài sản sẽ ổn thôi.

+0

Tôi có một ứng dụng giống như quản trị viên tự động, sử dụng các trường để hiển thị và chỉnh sửa thông tin về các đối tượng một cách thống nhất. Không có tính năng mà tôi đang tìm kiếm, tôi phải xử lý các thuộc tính như vậy theo cách cụ thể, lưu trữ và xử lý nhãn (verbose_name), help_texts, v.v. Đó là vụng về và lộn xộn. –

+0

bạn không cần phải chỉnh sửa 'tuổi' chỉ' sinh nhật'. Không có vấn đề gì 'sinh nhật' là' tuổi' sẽ luôn luôn là một chức năng của 'sinh nhật' (tức là bây giờ - sinh nhật). đó là lý do tại sao tôi không thể hiểu những gì bạn đang cố gắng để nói. –

+0

Tôi có một lớp: 'class PersonReportPrinter (ReportPrinter)' với các trường 'model = Person' và' columns = ('id', 'name', 'age') 'và lớp đó sử dụng' Person._meta.get_field_by_name' để nhận 'verbose_name' và' help_text'.Trên thực tế, ứng dụng thực sự có phần phức tạp hơn, có một số mô hình và một số lớp trợ giúp, do đó cách giải quyết quá khó chịu. –

0

Tôi nghĩ giải pháp là tạo tiện ích tùy chỉnh cho trường ngày sinh. Tất cả những gì bạn muốn là thay đổi cách hiển thị ngày sinh và cách chỉnh sửa ngày sinh. đó chính xác là mục đích của tiện ích.

Xin lỗi tôi không có mã cho rằng, nhưng đây là một nơi tốt để bắt đầu:

https://docs.djangoproject.com/en/dev/ref/forms/widgets/

1

Một cách khác để đi về nó mà có thể được đơn giản hơn, là sử dụng tùy chỉnh hình thành trong mô hình quản trị. Một cái gì đó như thế này:

class Person (models.Model): 
    birthday = models.DateField() 

class PersonForm(forms.ModelForm): 
    age = forms.IntegerField() # This will not be in the database 
    class Meta: 
     model = Person 
    def __init__(self, *args, **kwargs): 
     # verify instance was passed 
     instance = kwargs.get('instance') 
     if instance: 
      self.base_fields['age'].initial = (datetime.datetime.now() - self.birthday).days 
     super(PersonForm, self).__init__(*args, **kwargs) 

class FooAdmin(admin.ModelAdmin): 
    form = PersonForm 
    # Save the age in the birthday field 
    def save_model(self, request, obj, form, change): 
     obj.birthday = datetime.datetime.now() + form.cleaned_data['age'] 
     obj.save() 
Các vấn đề liên quan