How to modify a Django model?

前端 未结 1 1787
傲寒
傲寒 2020-12-18 12:32

If I would like to change e.g. Django\'s Site module:

from django.contrib.sites.models import Site

How would I do that in my project? Do I

相关标签:
1条回答
  • 2020-12-18 13:30

    You can add a field via inheritance

    If you still need to keep a reference to the original Site object/row, you can use multi-table inheritance

    from django.contrib.sites.models import Site
    
    class MySite(Site):
        new_field = models.CharField(...)
    
        def new_method(self):
            # do something new
    

    This allows you to have regular Site objects, that may be extended by your MySite model, in which case you can e.g. access the extra fields and methods through site.mysite, e.g. site.mysite.new_field.

    Through model inheritance, you cannot alter an ancestor field

    Through inheritance you cannot hide ancestor fields, because Django will raise a FieldError if you override any model field in any ancestor model.

    And I wouldn't venture and write a custom DB migration for this, because then if you update Django, you may get schema conflicts with the Site model.

    So here's what I would do if I wanted to store more info that the ancestor model allows:

    class SiteLongName(Site):
        long_name = models.CharField(max_length=60)
    
    0 讨论(0)
提交回复
热议问题