Я оптимизирую серверную часть своего django проекта, но у меня много проблем с list_display, который содержит ForeignKey - PullRequest
0 голосов
/ 06 августа 2020

django мастеров по всему миру Я корейский разработчик и начал django 3 месяца в go.

Теперь я просто раб своей компании. В любом случае, у меня есть проблема с оптимизацией проекта администратора django, но никто не сталкивался с такой проблемой.

Это мои модели «Проект», «Ответ», «Запрос».

# ------------------------------------------------------------------
# Model   : Project
# Description : project model
# ------------------------------------------------------------------
class Project(models.Model):

    class Meta:
        verbose_name = '     project'
        verbose_name_plural = '     project'

    def __str__(self):
        return str(self.id)

# ------------------------------------------------------------------
# Model   : Request
# Description : Request model
# ------------------------------------------------------------------
class Request(models.Model):
       
    client = models.ForeignKey(Client, on_delete=models.CASCADE, verbose_name='client')
    project = models.ForeignKey(Project, on_delete=models.CASCADE, verbose_name='project')
    product = models.ForeignKey(Subclass, on_delete=models.CASCADE, verbose_name='product')
    
    category = models.ManyToManyField(Develop, verbose_name='category')
    
    name = models.CharField('name', max_length=256, blank=True, null=True)
    price = models.CharField('price', max_length=256, blank=True, null=True)
    day = models.CharField('duedate', max_length=256, blank=True, null=True)
    content = RichTextUploadingField('content', null=True)
    file = models.FileField('file', upload_to=request_update_filename, blank=True, null=True)
    created_at = models.DateTimeField('created_at', default=time)
    
    add_meeting = models.BooleanField('add_meeting', default=False, null=True)
    
    examine = models.BooleanField('check examing', default=False, null=True)
    active_save = models.BooleanField('active-save', default=True, null=True)

    class Meta:
        verbose_name = '     request'
        verbose_name_plural = '     requests'

    def __str__(self):
        return str(self.name)


class Answer(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE, verbose_name="client")
    project = models.ForeignKey(Project, on_delete=models.CASCADE, verbose_name="project", null=True)
    partner = models.ForeignKey(Partner, on_delete=models.CASCADE, verbose_name="partner")
    
    class Meta:
        verbose_name = '     Answer'
        verbose_name_plural = '     Answer'

    def __str__(self):
        return str(self.id)

and this is my admin code

@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
    inlines = [RequestInline,AnswerInline]
    list_display = ['request_name','client_email','project_price','project_created','count_answer','count_meeting','answer_status']

    def request_name(self, obj):
        project_id = obj.id
        request_name = Request.objects.get(project = project_id)
        return request_name
        
    def client_email(self, obj):
        project_id = obj.id
        client = Request.objects.get(project=project_id).client
        return client
        
    def client_phone(self, obj):
        project_id = obj.id
        client = Request.objects.get(project=project_id).client
        phone = User.objects.get(username=client).phone
        return phone
    
    def project_price(self, obj):
        project_id = obj.id
        request_price = Request.objects.get(project=project_id).price
        return request_price

    def project_created(self, obj):
        project_id = obj.id
        created_at = Request.objects.get(project=project_id).created_at
        return created_at

    def count_answer(self, obj):
        project_id = obj.id
        answer_qs = Answer.objects.all()
        answer = Answer.objects.filter(project=project_id)
        count = len(answer)
        return count

    def count_meeting(self, obj):
        project_id = obj.id
        answer_yes = Answer.objects.filter(project = project_id, state = 1)
        count = len(answer_yes)
        return count
        
    def answer_status(self, obj):
        project_id = obj.id
        answer = Answer.objects.filter(project = project_id, info_check =1)
        count = len(answer)
        return count

Есть много факторов, не включенных в вышеизложенное, но я хочу решить не тот же набор запросов (Запрос, Ответ). Сам проект представляет собой структуру, не имеющую атрибутов, а получаемую только по внешним ключам. Такая структура затрудняет поиск решения.

Я использовал select_related (также prefetch_related), но он не работает.

Если вы можете дать мне совет, я бы хотел взять совет. спасибо.

ps Я впервые задаю вопрос на этом сайте, прошу прощения, если было что-то грубое.

1 Ответ

0 голосов
/ 06 августа 2020

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

...