#django #django-models
#django #django-модели
Вопрос:
Мне нужно сгенерировать одну запись, когда пользователь создает ее, а в модели уже есть другая с такими же или подходящими данными.
Например:
models.py
class Generated(models.Model):
stage = models.PositiveSmallIntegerField()
group = models.PositiveSmallIntegerField()
и у нас уже есть запись Generated(stage=1, group=1)
, затем мы создаем другую, Generated(stage=1, group=2)
и нам нужно сгенерировать еще одну запись, например Generated(stage=2, group=1)
Итак, как это сделать?
Ответ №1:
Вы можете попробовать использовать get_or_create
и django signal
для автоматического сохранения альтернативной записи. смотрите приведенный ниже код:
models.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.db import models
class Generated(models.Model):
stage = models.PositiveSmallIntegerField()
group = models.PositiveSmallIntegerField()
@receiver(post_save, sender=Generated):
def create_alternate(sender, instance, created, **kwargs):
try:
if created:
Generate, create = Generated.objects.get_or_create(
state=instance.group,
group=instance.state
)
if create:
Generate.save()
except:
print('Error creating alternate record!')
print(e)
Приведенный выше код создаст или просто получит альтернативную запись, если будет создана новая запись.
Надеюсь, это решит вашу проблему.
Комментарии:
1. Я использовал метод save(). Как вы думаете, ваш способ может быть более правильным?
2. Я предлагаю вам перейти к may, потому что он не будет повторять процесс сохранения бесконечное время и не вызовет никаких ошибок
MisMatchingQuery
, а повторяющиеся записи не будут созданы.
Ответ №2:
Для этого вы можете использовать сигналы
from django.db.models.signals import post_save
class Generated(models.Model):
stage = models.PositiveSmallIntegerField()
group = models.PositiveSmallIntegerField()
def gen_func(sender, instance, *args, **kwargs):
if instance.stage != instance.group:
Generated.objects.create(stage=instance.group, group=instance.stage)
post_save.connect(gen_func, sender=Generated)
вы можете изменить gen_func
ее в соответствии с вашими требованиями