gpt4 book ai didi

python - 基于此模型触发另一个模型的数据更改(M2M)

转载 作者:行者123 更新时间:2023-12-01 06:12:05 24 4
gpt4 key购买 nike

基本上,我正在尝试使用一个模型中的数据来触发另一个模型中的切换。

如果我的发票对象与文件链接,我希望该文件被“锁定”( bool 值)。

我发现当我保存发票时,将其与文件链接后,它不会注册发票_file.count() > 0 - 直到我下次打开发票并再次保存它。请注意,我是在调用 super() 之后进行评估,所以我发现这充其量是令人困惑的。

class Invoice(models.Model):
...
invoice_file = models.ManyToManyField(UploadFile, null = True, blank = True)
def save(self, *args, **kwargs):
print('Invoice: saving!')
super(Invoice, self).save(*args, **kwargs)
print 'invoice_file count: %i' % self.invoice_file.count()
if self.invoice_file.count() > 0:
for invoice_file in self.invoice_file.all():
if(invoice_file.locked_status(1)) != 1: raise Exception('Couldn\'t set file locked status to 1 on file %s' % invoice_file.filename)

这会触发 UploadFile 模型中的一个函数:

class UploadFile(models.Model):
...
def locked_status(self, stat):
print('Locked status called.')
if stat == 1:
self.locked = True
self.save()
return 1
elif stat == 0:
self.locked = False
self.save()
return 0

def save(self, *args, **kwargs):
print 'UploadFile: Saving!'
super(UploadFile, self).save(*args, **kwargs)

最佳答案

删除以下行:

if self.invoice_file.count() > 0:

如果您要进行数据库命中,您也可以通过检索与发票关联的所有文件来实现。这应该具有检索相关对象的“新鲜” View 的额外好处。

问题可能更深层次。在保存其包含的模型之前,无法保存 ManyToMany 字段。一个例子:

class Post(models.Model):
title = models.CharField(max_length=100)
commenters = models.ManyToManyField(User)

me = User.objects.get(username='Josh')
p = Post(title="ManyToManyExample")
p.commenters.add(me) # error, Post does not yet have an ID.
p.save()
p.commenters.add(me) # success!

您的 invoice_file 字段命名不准确。它应该被称为invoice_files,因为它是一个集合。在您的 Invoice.save 方法中,您尝试在将任何 UploadFile 添加到相关集合之前迭代该集合。我建议向您的 Invoice 模型添加一个方法。

class Invoice(models.Model):
...

def add_invoice_file(self, uploaded_file):
self.invoice_files.add(uploaded_file) # error if the Invoice hasn't been saved yet
for invoice_file in self.invoice_files.all():
status = invoice_file.locked_status(1)
if status != 1:
raise Exception('Blah')

如果发票与大量文件关联,则不应使用 .all(),而应执行 self.invoice_files.filter(locked=False) 。无论如何,为了避免大量不必要的数据库保存,甚至可能值得这样做。

关于python - 基于此模型触发另一个模型的数据更改(M2M),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5279728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com