You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:15:37