Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 德扬戈。主模型保存后,相关模型返回无_Python_Django_Django Models_Django Signals - Fatal编程技术网

Python 德扬戈。主模型保存后,相关模型返回无

Python 德扬戈。主模型保存后,相关模型返回无,python,django,django-models,django-signals,Python,Django,Django Models,Django Signals,我有两种型号:Item和Photo项目是照片的外键,因此一个项目可以连接多张照片,这很常见 项目类别: class Item(models.Model): name = models.CharField('Item Name', max_length = 150, null = False, blank = False ) description = RichTextField('Item Description') 摄影课: class Photo(models.Mo

我有两种型号:
Item
Photo
<代码>项目是照片的外键,因此一个项目可以连接多张照片,这很常见

项目类别:

class Item(models.Model):
name = models.CharField('Item Name',
    max_length = 150,
    null = False,
    blank = False
)
description = RichTextField('Item Description')
摄影课:

class Photo(models.Model):

path_and_rename = PathAndRename()

photo = models.ImageField(upload_to = path_and_rename, blank = True, null = True)
item = models.ForeignKey('Item', related_name = 'photo_set')
当我用一堆照片创建新的
项目
条目时,我想做一些额外的事情:启动异步任务,为用户编制索引并发送电子邮件通知-
一些异步任务()
。我正试图通过
Item.save()
method:

    def save(self):
    super(Item, self).save()

    some_async_task.delay(self.id)


@task(name="something")
def something(item_id):
    print Item.objects.get(pk=item_id).photo_set.first().photo.url
项目模型的
save()
方法似乎正是我所需要的,但问题是,即使在调用
super()
之后,我也无法获得相关照片条目的数据,因为这种关系不存在

在创建项目条目并关联所有相关照片条目之后,运行方法的最佳方式是什么


post\u save
信号不能解决问题。

因为
项目
是主要模型,并且照片是相关的,这意味着当保存
项目
时,它不一定与照片有关系

要知道这是何时发生的: “在创建项目条目并关联所有相关照片条目后运行方法” 这取决于您的业务逻辑

你知道在你的视图中,所有的照片都是什么时候添加的吗

如果是:然后在视图代码中随时调用任务

如果否:

  • 覆盖
    Photo.save()
    (在每个新照片之后调用任务)
  • 或者在您当前的任务代码中,添加一个检查是否有任何照片(在任何情况下,这可能都是值得添加的内容)
  • 使用信号处理程序(
    post_save
    :)而不是重写
    save()

请发布部分代码抱歉。现在无法访问控制台,因此无法粘贴错误代码。稍后将更新谢谢Risadinha。我在
Item
对象上实际使用了
post\u save
信号。结果相同。因此,似乎最好调整
Photo.save()
方法或将
post\u save
信号绑定到
Photo
并在每次照片更新时运行任务。另外,我将
sleep(10)
函数放在异步任务的顶部,所以在实际查询被传递到数据库的那个一刻,所有条目都被更新,关系被保存。它是有效的。但我仍然不喜欢这样的方法。在思考了一点(这总是必要的:)之后,很明显,这样的逻辑应该只进入视野。把所有的东西都放进模型中并链接信号是个坏主意。只有视图可以完全控制相关模型的流,所以我所需要的只是在
item.save()之后将对异步任务的调用放入视图中。