Django:如果满足某些条件,请运行一个函数

时间:2020-05-29 23:51:11

标签: django function django-models

我有一个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)

我也有一个抽认卡模型,用户可以在其中添加和研究抽认卡。在这里,我仅显示相关代码:

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

当用户创建新单词时,我想给他们提供使用提供的信息自动创建抽认卡的选项。换句话说,问题= target_word,答案= source_word,卡片组名称可以是某些默认值,也可以在Word模型中添加一个字段。有没有一种方法可以通过使用Word模型的add_to_review字段和FlashcardManager模型的create_flashcard方法来做到这一点?我尝试将一个函数添加到我的Word模型中,如果add_to_review为true,则该函数可以运行。我没有任何错误,但是什么也没有发生。

我知道一个选择就是将两种模型结合起来...但是我有自己的理由将它们分开。我可能仍会这样做,但我只是想知道我尝试做的事是否可能/可行?我不太确定Google到底要用什么,所以还没有找到任何相关信息。因此,任何建议都会很棒,谢谢!

1 个答案:

答案 0 :(得分:0)

不确定这是否是最好的方法,但它确实有效。最初,我遇到了无法调用信号的问题,但是当我将其移到我的models.py文件中时,而不是将其单独放在Signals.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)
相关问题