【问题标题】:Django : creating a field having the value of the (django-generated ) primary key of the same modelDjango:创建一个具有相同模型的(django-generated)主键值的字段
【发布时间】:2019-02-13 22:28:50
【问题描述】:

我正在尝试创建一个等于 Django 生成的主键值 (id) 的整数字段 (topic_id)。

class Topic(models.Model):
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)
    topic_id = ?????

感谢您的宝贵时间。

【问题讨论】:

    标签: django model field


    【解决方案1】:

    将其声明为方法并使用@property 装饰器将其作为实际属性返回。

    class Topic(models.Model):
        text = models.CharField(max_length=200)
        date_added = models.DateTimeField(auto_now_add=True)
        @property
        def topic_id(self):
            return self.id
    

    【讨论】:

    • 我不想把topic_id变成主键,只想让topic_id取回id的值
    • 在我写的程序中,我需要'topic_id'作为模型Topic的一个变量。如果不可能,我会重新编写我的程序以适应您的解决方案。谢谢兄弟。
    【解决方案2】:

    您可以使用here 解决方案将topic_id 设为id 的别名:

    class AliasField(models.Field):
        def contribute_to_class(self, cls, name, private_only=False):
            super(AliasField, self).contribute_to_class(cls, name, private_only=True)
            setattr(cls, name, self)
    
        def __get__(self, instance, instance_type=None):
            return getattr(instance, self.db_column)
    
    class Topic(models.Model):
        text = models.CharField(max_length=200)
        date_added = models.DateTimeField(auto_now_add=True)
        topic_id = AliasField(db_column='id')
    

    【讨论】:

    • AttributeError : 模块 'django.db.models' 没有属性 'AliasField'
    • 我的错。我已经用AliasField 的定义更新了我的答案。
    • 在不同的应用程序中尝试 4 次,仍然得到:“AttributeError : module 'django.db.models” has no attribute 'AliasField'(我在 django2.1 仅供参考)
    • 现已修复。 AliasField 不属于 models 包。
    • 没有更多错误,但变量“topic_id”在模型中无处出现。 Topic模型的结构还是(id, text, date_added)。
    【解决方案3】:

    将您的 topic_id 设为整数字段

    在 def save() 中:

    self.topic_id = self.id
    

    【讨论】:

    • 我是一个完整的 django 菜鸟,能否请你说的更具体一些...thx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2020-12-23
    • 2014-12-24
    • 2015-08-22
    • 2020-06-19
    • 1970-01-01
    相关资源
    最近更新 更多