Невозможно адаптировать тип при использовании пользовательского поля в панели администратора django

Я пытаюсь добавить пользовательское поле в админпанель актера, чтобы показать количество фильмов, которые каждый внес в админпанель. административной панели.

from django.contrib import admin

from actors.models import Actor


@admin.register(Actor)
class ActorAdmin(admin.ModelAdmin):
    search_fields = ('actor_name',)
    list_filter = ('gender',)
    list_display = ['actor_name', 'age', 'gender', 'movies_count']
    readonly_fields = ['movies_count']

    def movies_count(self, obj):
        count = 0
        for mv in Actor.objects.raw('select * from movies_movie_actors '
                                    'where actor_id='
                                    '(select id from actors_actor where actor_name="%s")', [obj]):
            count += 1
        return str(count)

    movies_count.short_description = 'movie count'

но я получаю ошибку

  • Тип исключения: ProgrammingError

  • Значение исключения: не удается адаптировать тип 'Actor'

что означает ошибка, почему она проявляется и как ее решить (допустимы различные подходы с той же целью)

может быть актуальным

модель актера :

from django.db import models

GENDER_LIST = [('male', 'male'), ('female', 'female')]


class Actor(models.Model):
    actor_name = models.fields.CharField(verbose_name='Name', max_length=25, unique=True)
    gender = models.CharField(verbose_name='Gender', choices=GENDER_LIST, max_length=6, default='male')
    age = models.IntegerField(default=0)
    create_time = models.TimeField(verbose_name='Created at', auto_now=True)
    update_time = models.TimeField(verbose_name='Updated at', auto_now=True)

    def __str__(self):
        return f'{self.actor_name}'

модель фильма :

from django.db import models
from django.db.models import CASCADE

from director.models import Director


class Movie(models.Model):
    movie_name = models.fields.CharField(verbose_name='movie name', max_length=25, unique=True)
    production_year = models.IntegerField(verbose_name='production year')
    actors = models.ManyToManyField('actors.actor')
    director = models.ForeignKey(Director, on_delete=CASCADE, related_name='movies')
    create_time = models.TimeField(verbose_name='Created at', auto_now=True)
    update_time = models.TimeField(verbose_name='Updated at', auto_now=True)

    def __str__(self):
        return f'{self.movie_name}'

    def __unicode__(self):
        return u'%s' % self.director.director_name

Я нашел способ достичь той же цели (получить количество фильмов для каждого актера, в который он/она внес свой вклад), используя встроенную функцию count() с __set

def movies_count(self, obj):
   return obj.movie_set.count()

но вопрос все еще возникает, что означает исключение can't adapt type?! и почему это происходит с сырым запросом?!

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