Общие модели DRF и внешний ключ

#django-rest-framework

Вопрос:

Я пытаюсь использовать некоторые общие атрибуты для всех моих объектов в БД, такие как created_by, updated_by, created_when и updated_when.

Итак, я создал класс для общих атрибутов:

 class CommonModel(models.Model):
"""Common fields that are shared among all models."""

    created_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT,
                               editable=False, related_name=" ")
    updated_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT,
                               editable=False, related_name=" ")
    created_at = models.DateTimeField(auto_now_add=True,
                                  editable=False)
    updated_at = models.DateTimeField(auto_now=True,
                                  editable=False)
 

Затем я ссылаюсь на общую модель в своих моделях:

 class Tag(CommonModel):
"""Tag to be used for products"""
name = models.CharField(max_length=255)

    def __str__(self):
        return self.name


class Vendor(CommonModel):
    """Vendor to be used for products"""
    name = models.CharField(max_length=255, unique=True)

    def __str__(self):
        return self.name
 

Но когда я ссылаюсь на тег или поставщиков в другой модели как foreign_key, я получаю сообщение об ошибке при выполнении миграции.

 class Product(CommonModel):
"""Model for the type of a product"""
    product_id = models.CharField(max_length=255, unique=False)
    description = models.CharField(max_length=255, unique=False, null=True, blank=True, default='')
    vendor = models.ForeignKey(Vendor, blank=False, null=False, on_delete=models.SET_DEFAULT)
    tag = models.ForeignKey(Tag, null=True, blank=True, on_delete=models.SET_NULL)
 

Сообщение об ошибке:

 SystemCheckError: System check identified some issues:

ERRORS:

core.Product.tag: (models.E006) The field 'tag' clashes with the field 'tag' from >model 'core.commonmodel'.
core.Product.vendor: (models.E006) The field 'vendor' clashes with the field 'vendor' from model 'core.commonmodel'.
 

Он работал нормально до того, как я представил общие модели.

Комментарии:

1. Вы создали CommonModel abstract = True модель?

2. @Willem, нет, я не видел этого в примерах, которые я нашел для общих моделей. как здесь andrew-tremblay.com/blog/django-common-models . Итак, мне нужно добавить его в саму общую модель?

3. @Empusas Виллем прав. Вам нужна модель, которая помечена как abstract = True . С помощью этого вы можете наследовать поля и поведение вашего суперкласса. наследование моделей

Ответ №1:

Вам нужно установить abstract в Meta, после этого он должен работать нормально.

 class CommonModel(models.Model):
"""Common fields that are shared among all models."""

    created_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT,
                               editable=False, related_name=" ")
    updated_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT,
                               editable=False, related_name=" ")
    created_at = models.DateTimeField(auto_now_add=True,
                                  editable=False)
    updated_at = models.DateTimeField(auto_now=True,
                                  editable=False)

    class Meta:
        abstract = True