Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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 如何在django中的模型实例之前保存相关的模型实例?_Python_Django_Django Models_Django Signals_Django Transmeta - Fatal编程技术网

Python 如何在django中的模型实例之前保存相关的模型实例?

Python 如何在django中的模型实例之前保存相关的模型实例?,python,django,django-models,django-signals,django-transmeta,Python,Django,Django Models,Django Signals,Django Transmeta,如何在实例模型之前保存相关的模型实例 这是必要的,因为我想在模型实例保存方法下预处理相关模型的实例字段 我正在从事Django项目,我的处境是,在实例的所有相关模型保存到数据库中之后,我需要运行一些函数 假设我有一个模型 models.py 创建视频模型的新实例时 我需要 1.首先保存所有相关模型。 A.如果相关模型为空,则返回空或无 2.然后保存此视频实例 我尝试使用post_save信号来完成,但没有成功,因为无法保证相关模型会首先被保存 from django.db.models.sign

如何在实例模型之前保存相关的模型实例

这是必要的,因为我想在模型实例保存方法下预处理相关模型的实例字段

我正在从事Django项目,我的处境是,在实例的所有相关模型保存到数据库中之后,我需要运行一些函数

假设我有一个模型

models.py 创建视频模型的新实例时

我需要 1.首先保存所有相关模型。 A.如果相关模型为空,则返回空或无 2.然后保存此视频实例

我尝试使用post_save信号来完成,但没有成功,因为无法保证相关模型会首先被保存

from django.db.models.signals import post_save, pre_delete, m2m_changed
from django.dispatch import receiver

from .models import Video


@receiver(m2m_changed, sender=Video)
@receiver(post_save, sender=Video)
def index_or_update_video(sender, instance, **kwargs):
    """Update or create an instance to search server."""
    # TODO: use logging system
    # Grab the id
    print("Id is", instance.id)
    # Keywords is empty as keyword instance is saved later than this instace.
    keywords = [keyword.keyword for keyword in instance.keywords.all()]
    print(keywords) # [] empty no keywords
    instance.index()


@receiver(pre_delete, sender=Video)
def delete_video(sender, instance, **kwargs):
    print("Delete index object")
    instance.delete()
更新: 可通过抓取post_保存信号和等待单元来实现 当相关的_模型被保存时,它的相关模型被保存在数据库中 启动序列化过程并创建平面json文件以及模型字段及其相关实例,以便平面json文件可以索引 进入弹性搜索服务器

问题是,我们应该在信号处理器方法中等待多长时间?以及如何知道数据库中保存的所有实例相关字段

class Video(models.Model):
    def save(self, *args, **kwargs): 
        # 1. Make sure all of its related items are saved in db 
        # 2. Now save this instance in db. 
        # 3. If the model has been saved. Serialize its value, 
        # 4. Serailize its related models fields 
        # 5. Save all the serialized data into index server 

        # The advantage of using this is the data are indexed in real 
        # time to index server. 

        # I tired to to implement this logic using signals, in case of 
        # signals, when the instance get saved, its related models are 
        # not instantly available in the databse. 

       # Other solution could be, grab the `post_save` signals, wait(delay
       # the serialization process) and start the serialization of 
       # instance model and it's related to convert the data to flat json 
       # file so, that it could index in the searching server(ES) in real 
       # time. 


       # until the instance related models get saved and start to 
       # serialize the data when its
在保存实例之前,可以替代模型的保存方法并保存相关模型对象


顺便说一下,我使用的是django admin,而不是在中定义逻辑 添加相关模型实例的视图由django admin处理

在这种情况下,您可以翻转ModelAdmin调用save_model和save_related的顺序,以便从model.save获得相关字段的更新值,如中所述


您正在将关键字实例传递到关键字字段或字符串吗?@scriptmonster关键字实例我知道如何重写save方法,但您能给我一个重写相关模型方法实例的示例吗?您能给我更多的代码吗?如何处理相关对象?创建新实例视频时,需要先保存它,然后再将关键字连接到此实例。之后,或者如果您使用exiting实例,您可以使用instance.keywords.addkeywords\u查询,它将调用m2m\u changed not post\u save。您显示模型,但如何使用此实例以及如何保存它?顺便说一句,我使用的是django admin,而不是在视图中定义逻辑,添加相关模型实例由django admin处理。如果您意识到您的管理类重写了ModelAdmin,您可以重写方法save_related和save_model。或者您是否尝试更改调用基本方法save_model和save_related的顺序?谢谢!这很有帮助。
class Video(models.Model):
    def save(self, *args, **kwargs): 
        # 1. Make sure all of its related items are saved in db 
        # 2. Now save this instance in db. 
        # 3. If the model has been saved. Serialize its value, 
        # 4. Serailize its related models fields 
        # 5. Save all the serialized data into index server 

        # The advantage of using this is the data are indexed in real 
        # time to index server. 

        # I tired to to implement this logic using signals, in case of 
        # signals, when the instance get saved, its related models are 
        # not instantly available in the databse. 

       # Other solution could be, grab the `post_save` signals, wait(delay
       # the serialization process) and start the serialization of 
       # instance model and it's related to convert the data to flat json 
       # file so, that it could index in the searching server(ES) in real 
       # time. 


       # until the instance related models get saved and start to 
       # serialize the data when its
class Video(models.Model):

    def save(self, *args, **kwargs): 
        if not self.id:
            super().save(*args, **kwargs)
        all_updated_keywards = self.keywards.all()
        ...
        super().save(*args, **kwargs)


class VideoAdmin(admin.ModelAdmin):

    def save_model(self, request, obj, form, change):
        if not obj.pk: 
            super().save_model(request, obj, form, change)
        else:
            pass 

    def save_related(self, request, form, formsets, change):
        form.save_m2m()
        for formset in formsets:
            self.save_formset(request, form, formset, change=change)
        super().save_model(request, form.instance, form, change)