如何在Django Admin中命名ManyToMany对象关联关系?
如何为Django的ManyToMany关联设置自定义显示名称
问题描述
需要为Django中job和jobTag的ManyToMany关联设置自定义显示名称,而非默认的object-n。现有模型代码如下:
class jobTag(models.Model): Tag = models.CharField(max_length=15) def __str__(self): return self.Tag class job(models.Model): Company_name = models.CharField(max_length=200, null=True, blank= True) Position = models.CharField(max_length=200, null=False, blank=False) Type = models.ForeignKey(jobType, default=" ",verbose_name="Type", on_delete=models.SET_DEFAULT) Industry = models.ForeignKey(jobIndustry, default=" ", verbose_name="Industry", on_delete=models.SET_DEFAULT) Location = models.ForeignKey(jobLocation, default=" ", verbose_name="Location", on_delete=models.SET_DEFAULT) Role_description = tinymce_models.HTMLField(default="") Role_requirements = tinymce_models.HTMLField(default="") Role_duties = tinymce_models.HTMLField(default="") Special_benefits = tinymce_models.HTMLField(default="") Date_posted = models.DateTimeField(auto_now_add=True) tags = models.ManyToManyField('jobTag', related_name="job-tags+", blank=True) def time_posted(self): return humanize.naturaltime(self.Date_posted) def __str__(self): return self.Position class Meta: verbose_name_plural = "Jobs"
尝试用代理中间表解决但无效,代码如下:
class jobjobTagProxy(job.tags.through): class Meta: proxy = True def __str__(self): return self.job.Position + ' // ' + self.tags.Tag
问题分析与解决
你使用代理模型的思路错误,Django自动生成的中间表无法通过代理模型替换原有实例的__str__行为。正确做法是手动定义中间表,而非使用代理:
步骤1:手动定义中间表
创建自定义中间表,关联job和jobTag,并重写__str__方法返回自定义名称:
class JobTagThrough(models.Model): job = models.ForeignKey('job', on_delete=models.CASCADE) job_tag = models.ForeignKey('jobTag', on_delete=models.CASCADE) def __str__(self): return f"{self.job.Position} // {self.job_tag.Tag}" class Meta: db_table = 'job_jobtag' # 匹配Django自动生成的中间表名,避免新建表 verbose_name = "职位标签关联" verbose_name_plural = "职位标签关联"
步骤2:修改ManyToManyField关联
更新job模型中的tags字段,指定through参数为自定义中间表,同时修正related_name的命名(避免使用连字符):
tags = models.ManyToManyField('jobTag', through='JobTagThrough', related_name="job_tags", blank=True)
注意事项
db_table必须与Django自动生成的中间表名一致(规则为小写模型名_小写关联模型名,此处为job_jobtag),确保不会重建表结构- 执行
makemigrations和migrate命令,更新模型元数据 - 此方法会全局生效,任何地方调用该关联对象时都会显示自定义名称
内容的提问来源于stack exchange,提问作者Random User
相关产品推荐
相关产品推荐

