Django OneToOneField和ForeignKeyField在字段中添加“_id”后缀

时间:2016-03-23 08:29:54

标签: python django

当我检查由Django创建的group_cover表时,有group_id_id字段和group_cover字段。 我想将group_id_id更改为group_id

models.py

class Group(models.Model):

    group_id = models.AutoField(primary_key=True)
    group_name = models.CharField(max_length=50, unique=False, blank=False)


class Group_Cover(models.Model):

    group_id = models.OneToOneField(Group, primary_key=True)  # this create group_id_id
    group_cover = models.ImageField(upload_to="/image/group/") 


class Group_Member(models.Model):

    user_id = models.ForeignKey(User2)  # this create user_id_id
    group_id = models.ForeignKey(Group)  # this create group_id_id

是的,如果我写,

group = models.OneToOneField(Group, primary_key=True)

它可能有效,但我可能不需要在某些字段上添加“_id”后缀。

我读了this document,但由于我英语不好,我无法理解。 你能告诉我如何改变吗?

3 个答案:

答案 0 :(得分:4)

Django将_id postix添加到自动生成的主键。除非使用旧数据库,否则通常无需担心它们。

解决方案2将是我推荐用于新项目的那个。遗留数据库的解决方案1。

解决方案1 ​​

要修改现有代码,请使用以下db_column属性,因为它允许您在数据库中命名该字段:

group = models.AutoField(primary_key=True, db_column='group_id')

Documentation

解决方案2

为了以更“Django”的方式获得相同的结果,让Django自动生成主键,然后在OneToOne和Foreign键字段中引用模型,如下所示。

class Group(models.Model):
    group_name = models.CharField(max_length=50, unique=False, blank=False)

class Group_Cover(models.Model):
    group = models.OneToOneField(Group)
    group_cover = models.ImageField(upload_to="/image/group/") 

class Group_Member(models.Model):
    user = models.ForeignKey(User2)
    group = models.ForeignKey(Group)

答案 1 :(得分:3)

您的假设是正确的,您需要将字段重命名为不包括_id(即group而不是group_id)。这将解决您的问题"但更重要的是它更准确地代表了关系/领域。您与模型有关系,而不是对id的引用。

_id是django提供的自动参考,可以让您更轻松地从模型中检索_id

来自documentation

  

在幕后,Django追加" _id"到字段名称以创建其数据库列名称。在上面的示例中,Car模型的数据库表将具有manufacturer_id列。 (您可以通过指定db_column显式更改此值)但是,除非编写自定义SQL,否则您的代码永远不必处理数据库列名。您将始终处理模型对象的字段名称。

答案 2 :(得分:2)

您不必担心数据库表中添加的_id。如果您在Django中使用ORM,则不应处理数据库。此外,除非特殊类型 - 属性组,否则不需要指定id 我会这样做(我相信你不需要那么多课程):

class Group(models.Model):
    name = models.CharField(max_length=50, unique=False, blank=False)
    cover = models.ImageField(upload_to="/image/group/") 
    users = models.ManyToManyField(User2)

然后您应该使用对象表示法访问属性。如果您想要ID,请使用group.id,如果您想要过滤对象,请使用Group.objects.filter(id__gt=10)Group.objects.get(id=1)等。我的模型应该正是您想要实现的目标。