【问题标题】:Why can't foreign key value be strings in my Django model?为什么外键值不能是我的 Django 模型中的字符串?
【发布时间】:2020-10-24 18:49:55
【问题描述】:

在我的 Django 模型中,外键保存为整数而不是字符串属性。为什么不是字符串?

class CreateRoutine(models.Model):
    createRoutineID = models.AutoField(default=None, max_length=20, primary_key=True, verbose_name='createRoutine ID')
    dpt_code = models.ForeignKey('Department', default=None, on_delete=models.CASCADE, verbose_name='dpt_code',
                                 db_column="dpt_code")
    fac_shortName = models.ForeignKey('Faculty', default=None, on_delete=models.CASCADE, verbose_name='fac_shortName',
                                      db_column="fac_shortName")
    batch = models.ForeignKey('Batch', default=None, on_delete=models.CASCADE, verbose_name='batch', db_column="batch")
    section = models.ForeignKey('Batch', default=None, on_delete=models.CASCADE, related_name='section',
                                verbose_name='section', db_column="section")
    roomCode = models.ForeignKey('Room', default=None, on_delete=models.CASCADE, verbose_name='roomCode',
                                 db_column="room")
    crs_title = models.ForeignKey('Course', default=None, on_delete=models.CASCADE, verbose_name='crs_title',
                                  db_column="crs_title")
    courseCode = models.ForeignKey('Course', default=None, on_delete=models.CASCADE, related_name='Code',
                                   verbose_name='courseCode', db_column="courseCode")
    day = models.ForeignKey('TimeSlot', default=None, on_delete=models.CASCADE, verbose_name='day', db_column="day")
    duration = models.ForeignKey('TimeSlot', default=None, on_delete=models.CASCADE, related_name='duration',
                                 verbose_name='duration', db_column="duration")

    class Meta:
        db_table = '"tbl_createRoutine"'
        verbose_name = "CreateRoutine"
        verbose_name_plural = "CreateRoutine"

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    您实际上可以将任何字段指定为primary_key,包括文本。你可能没有为你的模型指定 primary_key,所以 Django 自动为你添加了一个 IntegerField 字段;这就是为什么您可以调用instance.idinstance.pk,即使您没有将它们添加为模型中的字段。 This document 将能够更详细地解释这一点。

    编辑/添加
    做了一些研究,显然您可以将引用模型的任何字段存储为外键,只要该字段为unique=True
    为此,请使用 ForeignKey 的 to_field read this 属性。

    class MyModel(Model):
        related = ForeignKey(RelatedModel, to_field='related_model_unique_field`)
    

    我希望这不会直接回答问题,但我相信您对此感到满意

    【讨论】:

    • Django 模型外键返回 id 而不是 unicode 中指定的数据库中属性的字符串或字符值。如何将外键保存为字符字段而不是数据库中的整数?示例 - 如果 fac_shortName 是外键,则应将其保存为字符字段而不是数据库中的整数
    • 好吧,我建议你在一些数据库浏览器中打开你的数据库并仔细查看它的结构。也许它会给你一些答案。
    • Django - 在字符串方法中返回外键字段。我怎样才能在代码中做到这一点?我检查了数据库 postgresql 外键存储为整数而不是字符变化字段
    • 我应该使用属性还是 unicode 来返回外键字符串?
    • 编辑了我的答案,请检查它 - 它允许您使用您的特殊字段作为 ForeignKey 值
    猜你喜欢
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2012-12-29
    • 2016-06-15
    • 2015-12-11
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多