Python 使用signals.py更新模型字段(SearchVector)

Python 使用signals.py更新模型字段(SearchVector),python,django,signals,Python,Django,Signals,我正在尝试使用post_保存信号更新搜索向量场。 通过“Admin.py”,它工作得很好,但通过“表单页面”,searchVector字段或任何其他字段都不会得到更新。 在表单页面中,我有多对多字段-“标记”,我通过它保存 “form.save_m2m”方法 请查看我的代码并建议。。 提前谢谢 #models.py class JobPostManager(models.Manager): def search(self, search_text): search_vec

我正在尝试使用post_保存信号更新搜索向量场。 通过“Admin.py”,它工作得很好,但通过“表单页面”,searchVector字段或任何其他字段都不会得到更新。 在表单页面中,我有多对多字段-“标记”,我通过它保存 “form.save_m2m”方法 请查看我的代码并建议。。 提前谢谢

#models.py
class JobPostManager(models.Manager):
    def search(self, search_text):
        search_vectors = (
            SearchVector(
                'job_title', weight='A', config='english'
            )
        )
        search_query = SearchQuery(
            search_text, config='english'
        )
        search_rank = SearchRank(search_vectors, search_query)
        trigram_similarity = TrigramSimilarity(
            'job_title', search_text
        )
        qs = (
            self.get_queryset()
            .filter(search_vector=search_query)
            .annotate(rank=search_rank + trigram_similarity)
            .order_by('-rank')
        )
        return qs

class JobPost(models.Model):
    job_title = models.CharField(max_length=100, db_index=True)
    job_description = models.TextField()
    tags = TaggableManager()
    author = models.ForeignKey(User, on_delete=models.CASCADE, db_index=True)
    company_name = models.CharField(max_length=100,blank=True,null=True, db_index=True)
    objects = JobPostManager()

    def __str__(self):
        return self.job_title

    def get_absolute_url(self):
        return reverse('job_post_detail', kwargs={'slug': self.slug, 'pk':self.pk})


####################################################################################
####################################################################################
# views.py 

class JobPostCreateView(LoginRequiredMixin, CreateView):
    model = JobPost
    fields = ['job_title','job_description','tags']
    widgets = {
    'tags' : forms.TextInput(attrs={'data-role':'tagsinput'}),
                    }
    def get_form(self):
        form = super().get_form()
        form.fields['tags'].widget = forms.TextInput(attrs={'value': 'all'})
        return form

    def form_valid(self, form):
        print("views - form valid - run ")
        newpost = form.save(commit=False)
        form.instance.author = self.request.user
        form.instance.company_name = self.request.user.company_name
        print("form---------------------------")
        print(form.instance.author)
        print(form.instance.job_title)
        print(form.instance.company_name)
        print("form end---------------------------")

        newpost.save()

        print('newpost')
        print('--------------------------------',newpost)
        print('newpost',newpost.author)
        print('newpost',newpost.job_title)
        print('Search VECTOR')
        print('-------------------')
        print(newpost.search_vector)        
        print('Search VECTOR')

        form.save_m2m()
        print('save_m2m-----------------------')
        print('form-------------',form)
        print('form end-------------------')

        return super().form_valid(form)


###########################################################################
###########################################################################
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import JobPost


@receiver(post_save, sender=JobPost)
def create_profile(sender, instance, created, **kwargs):
    if created:
        # JobPost.objects.update(search_vector="instance")
        print("i am inside --------------signal")
        print(instance.job_title)
        print(instance.job_description)
        print(instance.tags)
        print(instance.company_name)
        print(instance.author)
        print('Search VECTOR')
        print('-------------------')
        print(instance.search_vector)        
        print('Search VECTOR')
        print("i am inside signal")
        print("i am inside signal")
        print("Signal end --------------------------------------")
        print("run filter  --------------------------------------")
        p = JobPost.objects.filter(pk=instance.pk)
        print(p)
        p2 = JobPost.objects.get(pk=instance.pk).search_vector
        print(p2)
        print(JobPost.objects.filter(pk=instance.pk)[0].job_title)

        print("run filter end--------------------------------------")
                
        p.update(search_vector="instance")
        JobPost.objects.filter(pk=instance.pk).update(job_title="Java developer")

        print('Search VECTOR after update ')
        print('-------------------')
        print(instance.search_vector)        
        print('Search VECTOR')

###########################################################################
############################################################################
## Form HTML
  <div class="row">
      <div  class="col-25">



        <label class="fr" for="{{ form.job_title.id_for_label }}">Job title *:</label>
      </div>
      <div class="col-75">
        {{ form.job_title }}
      </div>
        <div class="invalid-tooltip">
          {{ form.job_title.errors }}
        </div>
    </div>
     
     <div class="row">
      <div class="col-25">
        <label class="fr" for="{{ form.job_description.id_for_label }}">Job description *:</label>
      </div>
      <div class="col-75">

        {{ form.job_description }}
      </div>
      <div class="invalid-tooltip">
       {{ form.job_description.errors }}
     </div>
    </div>
#############################################################
#models.py
类JobPostManager(models.Manager):
def搜索(自搜索、搜索文本):
搜索向量=(
搜索向量(
“职务头衔”,权重class='A',配置class='english'
)
)
search\u query=SearchQuery(
搜索文本,config='english'
)
搜索排名=搜索排名(搜索向量、搜索查询)
三元相似性=三元相似性(
“职务”,搜索文本
)
qs=(
self.get_queryset()
.filter(搜索向量=搜索查询)
.注释(等级=搜索等级+三元相似性)
.order_by('-rank'))
)
返回qs
类职位(models.Model):
job_title=models.CharField(最大长度=100,db_索引=True)
作业描述=models.TextField()
tags=TaggableManager()
author=models.ForeignKey(用户,on_delete=models.CASCADE,db_index=True)
company_name=models.CharField(最大长度=100,空白=True,空=True,db_索引=True)
对象=JobPostManager()
定义(自我):
返回self.job\u标题
def get_绝对_url(自身):
返回反向('job\u post\u detail',kwargs={'slug':self.slug,'pk':self.pk})
####################################################################################
####################################################################################
#views.py
类JobPostCreateView(LoginRequiredMixin,CreateView):
模型=职位
字段=['job_title'、'job_description'、'tags']
小部件={
“标记”:forms.TextInput(attrs={'data-role':'tagsinput'}),
}
def get_表格(自我):
form=super().get_form()
form.fields['tags'].widget=forms.TextInput(attrs={'value':'all'})
报税表
def表单_有效(自身、表单):
打印(“视图-表单有效-运行”)
newpost=form.save(commit=False)
form.instance.author=self.request.user
form.instance.company\u name=self.request.user.company\u name
打印(“表格----------------------”)
打印(form.instance.author)
打印(form.instance.job\u title)
打印(表单.实例.公司名称)
打印(“表格结束----------------------”)
newpost.save()
打印('newpost')
打印('--------------------------------------',newpost)
打印('newpost',newpost.author)
打印('newpost',newpost.job\u title)
打印('搜索向量')
打印('-------------')
打印(newpost.search\u向量)
打印('搜索向量')
表单.保存_m2m()
打印('save_m2m--------------------'))
打印('表格----------------',表格)
打印('表单结束-----------------')
返回super().form_有效(form)
###########################################################################
###########################################################################
从django.db.models.signals导入后保存
从django.dispatch导入接收方
from.models导入JobPost
@接收方(post_save,发送方=JobPost)
def create_配置文件(发送方、实例、已创建、**kwargs):
如果创建:
#JobPost.objects.update(search_vector=“instance”)
打印(“我在里面------------信号”)
打印(实例.作业\标题)
打印(实例.工作描述)
打印(instance.tags)
打印(例如,公司名称)
打印(instance.author)
打印('搜索向量')
打印('-------------')
打印(实例搜索向量)
打印('搜索向量')
打印(“我在信号灯内”)
打印(“我在信号灯内”)
打印(“信号结束-----------------------------------------------------------------------------------”)
打印(“运行过滤器-----------------------------------------------------------------------------------------------------)
p=JobPost.objects.filter(pk=instance.pk)
印刷品(p)
p2=JobPost.objects.get(pk=instance.pk).search\u向量
打印(p2)
打印(JobPost.objects.filter(pk=instance.pk)[0]。作业标题)
打印(“运行过滤器结束--------------------------------------------------------------------------------------)
p、 更新(search_vector=“instance”)
JobPost.objects.filter(pk=instance.pk).update(job_title=“Java开发者”)
打印('更新后搜索向量')
打印('-------------')
打印(实例搜索向量)
打印('搜索向量')
###########################################################################
############################################################################
##表单HTML
职位*:
{{form.job_title}
{{form.job_title.errors}
职位描述*:
{{form.job_description}
{{form.job_description.errors}
#############################################################

为了绝对肯定,一切都保存得很好,但你的信号没有被调用,对吗

这可以通过在
apps.py
文件中添加两行代码来解决(该文件应该与
models.py
文件位于相同的深度)。例如,如果应用程序(或包含
models.py
的文件夹)被称为“作业”,并且
create\u profile
位于名为
signals.py
的文件中,则应如下修改
apps.py
文件:

从django.apps导入AppConfig
从django.utils.translation导入ugettext\u lazy作为_
类作业配置(AppConfig):
名称='jobs'
详细名称=(作业)
#