首页 > 解决方案 > 我正在优化我的 django 项目后端,但是在包含 ForeignKey 的“list_display”上遇到了很多问题

问题描述

世界各地的 django 大师我是韩国开发人员,3 个月前开始使用 django。

现在我只是我公司的奴隶。无论如何,我在优化 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

上面没有包含很多因素,但是我要解决的不是引入同一个queryset(Request, Answer)。项目本身是一个结构,没有属性,只能由外键接收。这样的结构使得很难找到解决方案。

我使用了 select_related(prefetch_related too),但它不起作用。

如果你能给我一些建议,我愿意接受一些建议。谢谢。

ps 这是我第一次在这个网站上提问,如果有任何粗鲁的地方,我很抱歉。

标签: djangooptimizationdjango-admin

解决方案


admin.TabularInline将在管理详细信息页面中显示可能对您有所帮助的反向外键,但似乎您已经在ProjectAdmin.


推荐阅读