Django: создание отношений в памяти без сохранения в БД

#django #django-models

#django #django-модели

Вопрос:

У меня есть несколько моделей с такими отношениями:

 class Item(model.Model):
    name = models.CharField()

class Group(models.Model):
    item = models.ManyToManyField(Item)

class Serie(models.Model):
    name = models.CharField()
    chart = models.ForeignKey(Chart)
    group = models.ForeignKey(Group)

class Chart(models.Model):
    name = models.CharField()
  

Мне нужно создать объект диаграммы «на лету», без сохранения в БД. Но я не могу этого сделать, потому что Django пытается использовать первичные ключи объектов при назначении отношений.

Я просто хочу Group.add(Item()) работать без необходимости сохранять объекты в БД.

Есть ли какой-нибудь простой способ обойти это?

Комментарии:

1. Я полагаю, вы передаете диаграмму интерфейсу для отображения? Почему бы просто не использовать обычные объекты python?

2. Потому что у меня есть некоторые другие методы для этих объектов, и я хотел бы использовать их без необходимости переписывать их в двух классах

Ответ №1:

Возрождение здесь ради будущих читателей:

Я обошел этот вариант использования, определив частный атрибут, который представляет отношения внутри классов, и свойство для проверки, может ли объект быть извлечен из БД или находится в памяти.

Вот простой пример:

 class Parent(models.Model):
    _children = []
    name = models.CharField(max_length=100)

    @property
    def children(self):
        if _children:
            return self._children
        else:
            return self.children_set.all()

    def set_virtual_children(self, value):  # could use a setter for children
        self._children = value  # Expose _children to modification

    def some_on_the_fly_operation(self):
        print(','.join([c.name for c in self.children]))   


 class Children(models.Model):
     parent = models.ForeignKey(Parent)
     name = models.CharField(max_length=100)
  

Таким образом, я могу установить «виртуальные дочерние элементы» и использовать все определенные методы «на лету»

Ответ №2:

РЕДАКТИРОВАТЬ: похоже, что описанного здесь подхода недостаточно для django, чтобы разрешить добавление к отношениям ManyToMany.

Вы пытались добавить primary_key=True и unique=True к name атрибуту модели элемента. Тогда это Group.add(Item("item_name_here")) должно сработать, если у вас есть возможность создавать name «на лету».

Я не тестировал это, но я думаю, что ваш способ не удался, потому add() что хочет использовать первичный ключ, который по умолчанию является идентификатором автозаполнения, который присваивается при его сохранении в базе данных.

Комментарии:

1. Мне нужно сохранить первичный ключ моделей, я просто хочу, чтобы Djanto не искал первичный ключ, если я не пытаюсь сохранить какой-либо из объектов.

2. @FC В этом случае я бы предположил, что это невозможно. Кстати. Я думаю, что даже добавления первичного ключа, который я предложил, будет недостаточно.