Как сгенерировать новую запись на основе текущей новой, а другая существовала в Django?

#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 ее в соответствии с вашими требованиями