Nas*_*sir 8 django django-orm django-queryset
我有一个数据模型如下:
class Candidate(models.Model):
    name = models.CharField()
class Skill(models.Model):
    name = models.CharField()
class CandidateSkill(models.Model):
    candidate = models.ForeignKey(Candidate)
    skill = models.ForeignKey(Skill, related_name='candidate_skills')
    proficiency = models.CharField()
在管理员中我有:
class CandidateSkillInline(admin.TabularInline):
    model = CandidateSkill
    fields = ('skill', )
    extra = 0
    raw_id_fields = ('skill',)
class CandidateAdmin(admin.ModelAdmin):
    model = Candidate
    fields = ('name',)
    inlines = [CandidateSkillInline]
每个候选人都可以有很多技能.这里的问题是,在每个内联的更改页面中,将使用一个查询来获取技能(SELECT ••• FROM "skill" WHERE "skill"."id" = <id>).如果我添加字段skill中CandidateSkillInline的read_only那么就不会有额外的查询.但是,我希望能够在内联中添加新项目.我试过了:
1)添加自定义formset CandidateSkillInline:
class CandidateSkillInlineFormset(BaseInlineFormSet):
    def __init__(self, *args, **kwargs):
        super(CandidateSkillInlineFormset, self).__init__(*args, **kwargs)
        self.queryset = self.queryset.select_related('skill')
2)覆盖get_queryset内联:
def get_queryset(self, request):
    super(CandidateSkillInline, self).get_queryset(request).select_related('skill')
3)覆盖get_queryseton CandidateAdmin:
def get_queryset(self, request):
    return super(CandidateAdmin, self).get_queryset(request).prefetch_related('candidate_skills__skill')
但是,我仍然可以查询每项技能.查询不被发送的唯一途径是当我设置skill的read_only_fields中CandidateSkillInilne.问题是我如何在一个查询中选择或预取技能而不是每个内联一个?
小智 1
这看起来像你正在尝试实现你自己的ManyToManyField. 您可以使用 ManyToManyField 和 inline 代替吗?它在管理中有一个很好的多选小部件。
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#working-with-many-to-many-models
| 归档时间: | 
 | 
| 查看次数: | 327 次 | 
| 最近记录: |