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