【问题标题】:How to selectively specify a django model field value when creating different model objects?创建不同模型对象时如何选择性地指定一个django模型字段值?
【发布时间】:2020-10-06 13:09:21
【问题描述】:

我的 django 应用中有以下模型:

from django.db import models

class TaskTracking(models.Model):
    name = models.CharField(max_length=20)

class Parent(models.Model):
    my_attribute = models.CharField(max_length=255, blank=True)
    my_attribute2 = models.CharField(max_length=255, blank=True)


class Child(Parent):
    tracking = models.ForeignKey(TaskTracking, on_delete=models.PROTECT)

然后我有另一个文件,我试图在其中创建这两个模型的实例。 我打算做的是根据参数调用 create 方法,如下所示:

from .models import *

class BaseObjectCreator:
    model = Parent
    def createModelObject(trackingEnabled=False):
        tracking_instance = None

        if trackingEnabled:
             tracking_instance = TaskTracking.objects.create(name='Dummy name')

        instance = self.model.objects.create(
                   my_attribute = 'value1',
                   my_attribute = 'value2',
                   tracking = tracking_instance if trackingEnabled
                   )

class ChildObjectCreator:
    model = Child
    def createModelObject(trackingEnabled=True):
        super().createModelObject(trackingEnabled)

但这行不通并且抛出错误tracking = tracking_instance if trackingEnabled。我需要这样的东西来重构涉及上面定义的模型的大型代码。你能提出正确的策略吗?

附: - Child 模型的跟踪属性是一个 FK,因此暗示了 NOT NULL 约束。

【问题讨论】:

  • 您没有指定else
  • @WillemVanOnsem,我想不出其他情况该怎么办。

标签: python django inheritance model overriding


【解决方案1】:

还有另一种策略来解决这个问题。你可以这样做:

from .models import *

class BaseObjectCreator:
    model = Parent
    def createModelObject(trackingEnabled=False):
        instance = self.model.objects.create(
                   my_attribute = 'value1',
                   my_attribute = 'value2',
                   )
        if (trackingEnabled):
            instance.tracking = 'value3'
            instance.save()

class ChildObjectCreator:
    model = Child
    def createModelObject(trackingEnabled=True):
        super().createModelObject(trackingEnabled)

我不知道是否有办法内联调用条件语句。但这似乎是一个足够干净的解决方案。

【讨论】:

  • 我想如果不是 FK 约束,这会起作用。我已更新问题以更准确地反映要求。
猜你喜欢
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多