首页 > 解决方案 > 如何在 django 中发布带有空字段的数据?

问题描述

我正在尝试拥有一个源类,该类将项目、配置文件、部门或团队作为来自 django_annoying 的 AutoOneToOne 字段。基本上,我试图访问 sourceID 和源类型(项目、配置文件、部门或团队),然后发送到不同的类:帖子。当我尝试为其他字段添加配置文件“s”和 null 的源时,如下所示:

为其他字段添加配置文件“s”和 null 的源

我收到以下错误消息:

错误信息

我已经尝试添加一个 default="",但这是违反直觉的,并且无论如何都不起作用。这是我的源类:

class Source(models.Model):
    profile = AutoOneToOneField('Profile', on_delete=models.CASCADE, null=True, blank=True)
    project= models.OneToOneField('Project', on_delete=models.CASCADE, null=True, blank=True)
    team = AutoOneToOneField('Team', on_delete=models.CASCADE, null=True, blank=True)
    department = AutoOneToOneField('Department', on_delete=models.CASCADE, blank=True, null=True)

    def __str__(self):
        return self.profile + self.project + self.team + self.department

标签: pythondjangodjango-modelsdjango-rest-framework

解决方案


问题在于您试图将其所有字段加在一起的Source模型__str__()方法,但它们不是字符串,并且不能连接。您可以先将它们中的每一个转换为字符串,但根据您的模型描述,四个字段中的三个将是None's。

如果要选择其中唯一的非空字段Source并返回其字符串表示形式:

def __str__(self):
    return str(self.profile or self.project or self.team or self.department)

如果您想将相同的选择标准用于其他目的,您可以首先将其作为自定义属性添加到模型中:

@property
def obj(self):
    return self.profile or self.project or self.team or self.department

def __str__(self):
    return str(self.obj)

然后您可以访问唯一的非空字段作为任何Source对象的属性,例如,获取其 ID 或类型(如您所述)。


推荐阅读