Как выборочно указать значение поля модели django при создании различных объектов модели? - PullRequest
0 голосов
/ 16 июня 2020

В моем приложении 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 . Мне нужно что-то подобное для рефакторинга большого кода, который включает модели, подобные тем, которые определены выше. Вы можете предложить правильную стратегию?

PS - Атрибут отслеживания дочерней модели является FK, поэтому подразумевается ограничение NOT NULL.

1 Ответ

0 голосов
/ 16 июня 2020

Есть другая стратегия для решения этой проблемы. Вы можете go об этом таким образом:

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)

Я не знаю, есть ли способ вызвать встроенные условные операторы. Но это кажется достаточно чистым решением.

...