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()
Run Code Online (Sandbox Code Playgroud)
在管理员中我有:
class CandidateSkillInline(admin.TabularInline):
model = CandidateSkill
fields = ('skill', )
extra = 0
raw_id_fields = ('skill',)
class CandidateAdmin(admin.ModelAdmin):
model = Candidate
fields = ('name',)
inlines = [CandidateSkillInline]
Run Code Online (Sandbox Code Playgroud)
每个候选人都可以有很多技能.这里的问题是,在每个内联的更改页面中,将使用一个查询来获取技能(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')
Run Code Online (Sandbox Code Playgroud)
2)覆盖get_queryset内联:
def get_queryset(self, request):
super(CandidateSkillInline, self).get_queryset(request).select_related('skill')
Run Code Online (Sandbox Code Playgroud)
3)覆盖get_queryseton CandidateAdmin:
def get_queryset(self, request):
return super(CandidateAdmin, self).get_queryset(request).prefetch_related('candidate_skills__skill')
Run Code Online (Sandbox Code Playgroud)
但是,我仍然可以查询每项技能.查询不被发送的唯一途径是当我设置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 次 |
| 最近记录: |