Джанго подает сигналы с полей ForeignKey - PullRequest
0 голосов
/ 03 марта 2019

Я создал структуру знаний, в которой есть «блоки», и у каждого блока есть дочерние элементы для обслуживания в различных ситуациях.

Код:

models.py

class KBSBlock(models.Model):
    name = models.CharField(max_length=150, unique=True)
    code = models.CharField(max_length=4, blank=True)
    status=models.CharField(max_length=1, choices=Status_Choices, default='Draft')
    enter_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT)
    tags = TaggableManager(blank=True)
    attribute1 = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)

def __str__(self):
    return self.name

def save(self, *args, **kwargs):
    if self.code is None or self.code == "":
        self.code = create_code4(self)
    super(KBSBlock, self).save(*args, **kwargs)

@receiver(post_save, sender=KBSBlock)
def create_block(sender, instance, created, **kwargs):
    if created:
        #create_block = BlockDetails.objects.create(block_dts=instance)
        print('Working!')

class BlockDetails(models.Model):
    block_dts = models.ForeignKey('KBSBlock', on_delete=models.CASCADE)
    code = models.CharField(max_length=2, blank=True)
    attribute1 = models.CharField(max_length=100, default='All')
    created_at = models.DateTimeField(auto_now_add=True)
    enter_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT)
    status=models.CharField(max_length=1, choices=Status_Choices, default='Draft')

Всякий раз, когда я создаю блок, я хочу создать общие детали в BlockDetails для блока с помощью (code = '00 ', attribute1 =' All ', enter_by =' request.user ')

Itпечатает «рабочий» бит с хэшированной строкой «create_block».

Я использую PostgreSQL, Django 2.1 и Python 3.7 и не могу понять, как это правильно.

Помощь Пожалуйста

1 Ответ

0 голосов
/ 05 марта 2019

Прежде всего, благодаря @ Дани Эррере и @ Давиду Товмасяну !Между ними я выяснил, в чем проблема: оказалось, что я ошибся в нескольких вещах.

Ошибка исходила из базы данных: value too long for type character varying(1) сообщая, что я пытался ввести строку, котораябыл слишком длинным для предполагаемого поля.Это поле было полем состояния. Похоже, что хотя опция выбора работала идеально в нормальных условиях, команда сигнала требовала только краткую форму выбора .

Правильный кодследующим образом:

@receiver(post_save, sender=KBSBlock)
def create_block(sender, instance, created, **kwargs):
    if created:
        instance.blockdetails_set.create(block_dts=instance.name, code='00', enter_by=instance.enter_by, attribute1='All', status='D')

Примечание: регистр имени модели ДОЛЖЕН быть строчным, даже если в классе моделей есть заглавные буквы

Как только я это исправил - все заработало.

...