Django: запускать функцию, если выполняется определенное условие. - PullRequest
0 голосов
/ 30 мая 2020

У меня есть модель Word, где пользователь может добавлять слова и различные поля, например, это (сокращенная версия):

class Word(models.Model):
    target_word = models.CharField()
    source_word = models.CharField()
    add_to_review = models.BooleanField(default=True)
    example_sentence = models.CharField()
    image = models.ImageField(upload_to='images/',blank=True)
    audio = models.FileField(upload_to='audio/',blank=True)

У меня также есть модель Flashcard, где пользователь может добавлять и изучать карточки. Здесь я показываю только соответствующий код:

class FlashcardManager(models.Manager):
    def create_flashcard(self, user, question, answer, deck_name):
        try:
            deck = Deck.objects.get(owner=user, name=deck_name)
        except ObjectDoesNotExist:
            deck = Deck(owner=user, name=deck_name)
            deck.save()

        self.create(owner=user, question=question, answer=answer,
                    deck=deck)
        return deck

class Flashcard(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    deck = models.ForeignKey(Deck, on_delete=models.CASCADE)
    question = models.TextField()
    answer = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    last_shown_at = models.DateTimeField(auto_now_add=True)
    next_due_date = models.DateTimeField(default=timezone.now)
    difficulty = models.FloatField(default=2.5)
    consec_correct_answers = models.IntegerField(default=0)

    objects = FlashcardManager()

    def __str__(self):
        return self.question

Когда пользователь создает новое слово, я хочу дать ему возможность автоматически создавать флэш-карту, используя предоставленную информацию. Другими словами, question = target_word, answer = source_word и имя колоды могут быть либо значением по умолчанию, либо я могу добавить поле в модель Word. Есть ли способ сделать это, используя поле add_to_review модели Word и метод create_flashcard модели FlashcardManager? Я пробовал добавить в свою модель Word функцию, которая запускается, если add_to_review истинно. Я не получаю ошибок, но ничего не происходит.

Я знаю, что одним из вариантов было бы просто объединить две модели ... но у меня есть свои причины держать их отдельно. Я все еще могу это сделать, но мне просто интересно, возможно ли то, что я пытаюсь сделать, или осуществимо? Я не совсем уверен, что именно гуглить, поэтому не смог найти никакой информации по этому поводу. Так что любой совет будет отличным, спасибо!

1 Ответ

0 голосов
/ 31 мая 2020

Не уверен, что это лучший способ, но он работал. Изначально у меня были проблемы с тем, что сигнал не вызывался, но это было исправлено, когда я переместил его в свой файл models.py вместо того, чтобы отделять его в файле signal.py.

@receiver(post_save, sender=Word)
def flash_from_word(sender, created, instance, **kwargs):
    if created:
        flash_wanted = Word.objects.filter(add_to_review=True)
        instance._meta.model.objects.all()
        target_word = instance.target_word
        source_word = instance.source_word
        deck_name = instance.deck_name
        user = instance.user
        if flash_wanted:
            flash = Flashcard.objects.create(owner=user, question=target_word,answer=source_word,deck=Deck.objects.get(name=deck_name,owner=user))

post_save.connect(flash_from_word, sender=Word)
...