【发布时间】:2017-04-19 18:40:32
【问题描述】:
尝试将项目列表批量添加到多对多字段时遇到了一些麻烦,尽管尝试了各种方法,但不知道如何解决这个问题。我查看了 Django 文档,但似乎找不到我要找的东西。
这是我的模型的代码:
class Subject(models.Model):
noun = models.CharField(max_length=30, null=True, blank=True)
class Knowledge(models.Model):
item_text = models.TextField()
item_subjects = models.ManyToManyField(Subject, null=True, blank=True)
def add_subjects(sender, instance, *args, **kwargs):
if instance.item_info:
item_subjects = classifier.predict_subjects(instance.item_info)
if item_subjects:
....
post_save.connect(add_subjects, sender=Knowledge)
列表由classifer.predict_subjects 函数生成。
我尝试使用m2m_changed 连接器和pre_save 和post_save 连接。我什至不确定多对多字段是否是正确的选择,建立外键关系会更好。
代替'...' 我已经尝试过了,但它不会创建之间的关系,只会保存最后一个。
for sub in item_subjects:
subject = Subject(id=instance.id, noun=sub)
subject.save()
我也试过
instance.item_subjects = item_subjects
还有很多我不记得的事情,老实说,我真的不认为我在正确的范围内。有什么建议吗?
编辑:
好的,所以我已经添加了所有列表项,但仍然没有设法将这些项目链接到多对多字段。
for sub in item_subjects:
subject = Subject.objects.get_or_create(noun=sub)
编辑 2:
因此,在 Django shell 的循环之外执行几乎完全相同的操作似乎可以正常工作并保存条目,但它不在函数内部。
>>> k[0].item_subjects.all()
<QuerySet []>
>>> d, b = Subject.objects.get_or_create(noun="cats")
<Subject: cats>
>>> k[0].item_subjects.add(d)
>>> k[0].item_subjects.all()
<QuerySet [<Subject: cats>]>
编辑 3
所以我接受了 Robert 的建议,它就像上面一样在 shell 中工作,只是在管理界面中使用它时不行。我的代码中的打印语句显示正在更新的数组项,但它只是不会持续存在。我四处阅读,这似乎与管理表单在保存之前清除项目有关。
def sub_related_changed(sender, instance, *args, **kwargs):
print instance.item_subjects.all()
if instance.item_info:
item_subjects = classifier.predict_subjects(instance.item_info)
if item_subjects:
for sub in item_subjects:
subject, created = Subject.objects.get_or_create(noun=sub)
instance.item_subjects.add(subject)
print instance.item_subjects.all()
post_save.connect(sub_related_changed, sender=Knowledge)
我已经尝试使用函数作为 m2m_changed 信号如下:
m2m_changed.connect(model_saved, sender=Knowledge.item_subjects.through)
但这要么生成递归循环,要么不会触发。
【问题讨论】:
标签: python django django-models django-orm