Тип контента 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.