Django抽象基类继承时ForeignKey反向查询名称冲突问题求助
错误原因
你遇到的是Django抽象基类外键字段反向查询名冲突问题,报错指向的是folder字段而非assignee字段,因此修改assignee无法解决问题:
抽象基类中如果对外键字段写死固定的related_name值,所有继承该抽象基类的子类,都会尝试为关联模型生成同名的反向查询属性,导致命名冲突。
解决方案
使用Django为抽象基类提供的%(class)s动态占位符,该占位符会自动替换为每个子类的小写类名,保证不同子类的反向查询名唯一,你也可以搭配%(app_label)s占位符适配多应用场景。
你只需要修改抽象基类File中folder字段的related_name即可:
folder = models.ForeignKey( Folder, on_delete=models.CASCADE, blank=True, null=True, related_name="%(class)s_resource_file" # 替换原固定值resource_file )
修改后QuillFile的反向查询名会自动变为quillfile_resource_file,UploadedFile的反向查询名自动变为uploadedfile_resource_file,不会再出现冲突。
当前你的assignee字段设置了related_name="+"(关闭反向查询),本身不会触发冲突,无需额外调整。
修改后完整代码示例
class File(models.Model): options = (("published", "Published"), ("draft", "Draft")) name = models.CharField(max_length=255) folder = models.ForeignKey(Folder, on_delete=models.CASCADE, blank=True, null=True, related_name="%(class)s_resource_file") status = models.CharField(max_length=10, choices=options, default="draft") tags = models.CharField(max_length=10) assignee = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, blank=True, null=True, related_name="+", ) dateCreated = models.DateTimeField(default=timezone.now) dateUpdated = models.DateTimeField(default=timezone.now) class Meta: abstract = True def __str__(self): return self.name class QuillFile(File): content = models.TextField(blank=True, null=True) def upload_to(instance, filename): return "posts/{filename}".format(filename=filename) class UploadedFile(File): file = models.FileField(upload_to=upload_to, blank=True, default="")
内容的提问来源于stack exchange,提问作者Jonathan Aplacador
相关产品推荐
相关产品推荐

