Тип контента Django, отображающий данные в формате `app_label: model` в панели администратора

Недавно я обновил версию своего приложения Django с 2.2.24 до 5.0.3. После обновления Django я начал получать данные content_type в таком формате `app_label: model` в моей Django dashboard, до обновления в Django admin данные content_type отображались в таком формате `model`. Это определение модели ContentType, и она импортируется из `django.contrib.contenttypes.models`

    class ContentTypeManager(BaseManager[ContentType]):
        def get_by_natural_key(self, app_label: str, model: str) -> ContentType: ...
        def get_for_model(
            self, model: type[Model] | Model, for_concrete_model: bool = ...
        ) -> ContentType: ...
        def get_for_models(
            self, *models: Any, for_concrete_models: bool = ...
        ) -> dict[type[Model], ContentType]: ...
        def get_for_id(self, id: int) -> ContentType: ...
        def clear_cache(self) -> None: ...

    class ContentType(models.Model):
        id: int
        app_label: models.CharField[Any] = ...
        model: models.CharField[Any] = ...
        objects: ClassVar[ContentTypeManager] = ...
        permission_set: Manager[Permission]
        @property
        def name(self) -> str: ...
        def model_class(self) -> type[Model] | None: ...
        def get_object_for_this_type(self, **kwargs: Any) -> Model: ...
        def get_all_objects_for_this_type(self, **kwargs: Any) -> QuerySet[Any]: ...
        def natural_key(self) -> tuple[str, str]: ...

**После этого изменения мои пользовательские функции сборки стали ломаться. Раньше это было так. А после обновления (данные немного отличаются, но формат изменен)

Это файл администратора

    class ProjectTaskForm(forms.ModelForm):
        experience = forms.ModelChoiceField(
        required=False,
        widget=forms.Select(attrs={'class': 'experience-selection'}),
        queryset=ContentType.objects.filter(app_label__in=app_label, model__in=models_)
    )

    class Meta:
        model = ProjectTask
        fields = '__all__'

Это модель ProjectTask, которая использует тип содержимого

    class ProjectTask(models.Model):
        project = models.ForeignKey('mentortogether.Project', on_delete=models.CASCADE, related_name='tasks')
        experience = models.ForeignKey(ContentType, on_delete=models.CASCADE)
        item_id = models.PositiveIntegerField()
        item = GenericForeignKey('experience', 'item_id')
        role = models.CharField(choices=MtUserRoles.CHOICES, max_length=10, default=MtUserRoles.BOTH)

        class Meta:
            unique_together = ("project", "experie`your text`nce", "item_id")

        objects = ProjectTaskManager()

        def __str__(self):
            return "{}-{}".format(self.experience, self.item)

И я не обновил код, связанный с ProjectTask и ProjectTask. Как я могу решить эту проблему, поскольку я использовал тип содержимого в нескольких местах?

Вы могли бы строго исправить это с помощью обезьяньего патча. Итак, в AppConfig наборе:

# some_app_name/apps.py

from django.apps import AppConfig


class SomeAppConfig(AppConfig):
    def ready(self):
        from django.contrib.contenttypes.models import ContentType

        def __str__(self):
            return self.name

        ContentType.__str__ = __str__

But this is likely not a good idea. It might be better not to assume anything of the format of the result of a str(…) call. You can use .name attribute [Django-doc] in your custom build functions.

Вернуться на верх