我有一个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到底要用什么,所以还没有找到任何相关信息。因此,任何建议都会很棒,谢谢!
答案 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)