【问题标题】:Django OneToOneField initializationDjango OneToOneField 初始化
【发布时间】:2018-03-26 17:49:18
【问题描述】:

我正在构建一个基于 django 的应用程序,它从客户端计算机(例如内存)接收一些信息并将其保存到数据库中。

为此,我创建了以下模型:

class Machine(models.Model):
   uuid = models.UUIDField('UUID', primary_key=True, default=uuid.uuid4, editable=False)
   name = models.CharField('Name', max_length=256)
   memory = models.OneToOneField('Memory', on_delete=models.CASCADE, null=True)

   def save_data(self, data):
        if not self.memory:
            memory = Memory()
            memory.save()
            self.memory = memory
            self.save()
        self.memory.total = data['memory_total']
        self.memory.used = data['memory_used']
        self.memory.cached = data['memory_total']
        self.memory.save()

现在对于内存,我有以下模型:

class Memory(models.Model):
    total = models.IntegerField(default=0)
    used = models.IntegerField(default=0)
    cached = models.IntegerField(default=0)

当我从客户端收到数据时,为了将数据保存到机器模型中,我调用了 save_data() 方法。在那里我测试是否已经有一个 self.memory 对象,如果没有,我在添加数据之前先创建它。

现在,即使它按预期工作,我想知道是否有更好、更干净的方法来实现这一点。是否可以将我所有的 OneToOne-Fields 初始化为引用类型的空实例,这样我就不需要每次都这样做?

【问题讨论】:

    标签: python django model initialization one-to-one


    【解决方案1】:

    字段接受 default 关键字参数。这可以是一个返回值的可调用对象。您可以创建一个返回适当值的可调用对象;在这种情况下,新创建的Memory 对象的主键。

    def default_memory():
        mem = Memory()
        mem.save()
        return mem.pk
    
    class Machine(models.Model):
        ...
        memory = models.OneToOneField('Memory', on_delete=models.CASCADE, null=True, default=default_memory)
    

    【讨论】:

    • 这对我不起作用。我得到django.db.utils.ProgrammingError: relation does not exist
    • @JohannesPertl 听起来您的错误是由其他原因引起的。考虑自己提出一个问题。
    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 2014-04-30
    • 2022-01-13
    • 2011-06-13
    相关资源
    最近更新 更多