Mixin Field в существующую и не редактируемую модель django - PullRequest
0 голосов
/ 13 октября 2011

Я хотел бы смешать поле с существующей моделью, которую я бы не хотел редактировать (это происходит от стороннего проекта, и я бы предпочел оставить проект без изменений).Я создал простой пример, который иллюстрирует то, что я пытаюсь, но не могу сделать:

В пустом проекте Django я создал приложения app1 и app2 (они находятся в таком порядке в настройках).Они выглядят следующим образом:

app1.models.py:

from django.db import models
from app2.models import BlogPost

class BlogPostExtend(models.Model):
    custom_field_name = models.CharField(max_length=200)

    class Meta:
        abstract = True

BlogPost.__bases__ = (BlogPostExtend,)+BlogPost.__bases__ # this prevents MRO error

app2.models.py:

from django.db import models

class BlogPost(models.Model):
    field_name = models.CharField(max_length=100)

К сожалению, это не приводит к тому, что custom_field_name будетсозданный в базе данных, когда я синхронизирую, хотя в командной строке, если я набираю BlogPost.custom_field_name, он распознает его как CharField.Я знаю, что в этом простом случае я мог бы наследовать BlogPost от BlogPostExtend, но в реальном случае я не могу редактировать BlogPost.

Это очень упрощенный пример, но он иллюстрирует то, что я пытаюсь сделать.

Спасибо!

1 Ответ

0 голосов
/ 14 октября 2011

Миксины прекрасно работают с добавлением атрибутов и методов, но не полей.

В app1.models.py, сделайте это вместо:

from django.db import models
from app2.models import BlogPost

custom_field_name = models.CharField(max_length=200)
custom_field_name.contribute_to_class(BlogPost, "custom_field_name")

Я думаю, что приложение app1 должно идти после app2 в INSTALLED_APPS, чтобы это работало.

Вот объяснение contribute_to_class

...