0

我使用 django cms 创建了一个名为“search”的应用程序,它基本上从用户那里获取一个单词,在 10 个 xml 文档中搜索它并返回每个 xml 文件中该单词出现的频率。这些数据存储在我使用 sqlite3 数据库创建的表中。

现在我的问题是,每当用户输入单词时,表中的先前数据都应该在不使用删除查询但通过代码片段的情况下被删除。因为这可以通过在 python 交互式 shell 上键入删除查询来轻松完成。

但是我希望一旦用户被引导到显示计数的结果页面,如果他再次输入另一个单词,则应该删除以前的数据。嘿,这是我的 views.py 代码:

# Create your views here.
#!/usr/bin/python 

from django.template import loader, RequestContext, Context
from django.http import HttpResponse
from search.models import Keywords
from django.shortcuts import render_to_response as rr

def front_page(request):

    if request.method == 'POST' :
        from skey import find_root_tags, count, sorting_list
        str1 = request.POST['word'] 
        str1 = str1.encode('utf-8')
        list = []
        path = '/home/pooja/Desktop/'
        fo = open("/home/pooja/Desktop/xml.txt","r")

        for i in range(count.__len__()):
            file = fo.readline()
            file = file.rstrip('\n')            
            find_root_tags(path+file,str1,i)    

            list.append((file,count[i]))

        sorting_list(list)

        for name, count1 in list:
            s = Keywords(file_name=name,frequency_count=count1)# saving my data in table here .
            s.save()

        fo.close()
        list1 = Keywords.objects.all()
        t = loader.get_template('search/results.html')
        c = Context({'list1':list1,})

        return HttpResponse(t.render(c))

    else :  
        str1 = ''
        template = loader.get_template('search/front_page.html')
        c = RequestContext(request)
        response = template.render(c)
        return HttpResponse(response)

我的models.py文件:

from django.db import models

class Keywords(models.Model):
    file_name = models.CharField(primary_key=True, max_length=100)
    frequency_count = models.IntegerField()

    def __unicode__(self):
        return self.file_name

请帮助,我是 django 的新手。

4

2 回答 2

0

看来您必须看看Django Signals。您可以使用信号 django.db.models.signals.pre_save 在保存新数据之前删除数据。可能这个文档 对理解它很有用。

更新:

第一种方式:不确定关键字是您保存结果的表。如果是保存结果的表,那么按照 Filip Dupanović 的建议,请在将搜索结果保存在数据库表中的代码之前运行Keywords.objects.all().delete()views.py中的代码

第二种方式:正如我之前告诉过你的,我们也可以通过使用信号来做到这一点。例如,假设我在 models.py 中的模型是这样的:

class Name(models.Model):
    name = models.CharField(max_length=200)

现在,在表中保存任何新名称之前,如果我想删除所有以前的条目,那么我可以这样做:

from django.db import models
from django.db.models import signals
from django.db.models.signals import pre_save

class Name(models.Model):
    name = models.CharField(max_length=200)

def delete_previous_records(**kwargs):
    try:
        Name.objects.all().delete()
    except:
        return False

pre_save.connect(delete_previous_records)

将此代码添加到您将数据保存在 views.py 中的 for 循环上方:

try:
    Keywords.objects.all().delete() #Deleting all previous records 
except: 
    return False
#your for loop starts here
for name, count1 in list:
    s = Keywords(file_name=name,frequency_count=count1)
于 2012-07-05T13:47:14.210 回答
0

Match.objects.delete()只需在开始编译新结果之前执行类似擦除视图中所有先前结果的操作。

于 2012-07-05T14:22:33.843 回答