#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 В этом случае я бы предположил, что это невозможно. Кстати. Я думаю, что даже добавления первичного ключа, который я предложил, будет недостаточно.