大家好
有兩個問題請教
我想請問
設某一物件的已存好屬性
後來可以再update它嗎
假設temp為[44,7,16]
可以update為[44,7,16,8]或[44,7,16,8,22]嗎?
重點就是已存好資料庫的值
可以透過什麼方式更動它嗎
另外,我可以由temp[0]、temp[1]、temp[2]
各別找出它們對應的另一屬性
假設temp[0]、temp[1]、temp[2]
分別代表第一row、第二row、第row的圖片url屬性
要怎麼利用temp求出這三個row的圖片url屬性並顯示呢
max([ (L[i], i) for i in range(len(L)) ])返回的是一个tuple(元组),其中第二个元素是索引值,需要“解压”到变量中才能作索引值;
下面是改进你好友的方法:
[code="python"]
x =[0,822,8,16]
y = Photo.objects.all()[:len(x)]
xylist = zip(x,y)
xylist.sort(reverse=True) #由大到小排序,xylit[0]最大,递减
[/code]
关于你说的“希望次要 接近的也可以顯示出來”,我给出几个实现方案
1.若很固定的显示几个这比较容易,只要[code="python"]
def select(xylist, n):
return xylist[:n]
[/code]
2.设定一个阈值,其他的比较数与最大的匹配数小于这个阈值时,认为是接近的
[code="python"]
def select(xylist, val):
max = xylist[0][0]
xylist = [x for x in xylist if(max-x[0]) [/code]
说明下,第一个方案时必须先由大到小排序,第二个方案不必排序。元素取完之后,xylist列表元素的形式与下面类似
[code="python"]
[(822,),(16,)]#xylist的长度跟给的参数有关
[/code]
我们可以通过这种方式取第一个图片的地址:xylist[0][1].pgm_url.
上面给出的两个方案都硬性规定了参数,参数可以动态产生,这跟实际应用有关,你可以根据自己的需要再编写合适的函数
假设lz是在视图函数里进行处理:
第一个问题:可以update,首先导入模型类:假设你的模型是这样的,[code="python"]from myproject.myapp.models import Book[/code]
然后运行通过条件获取相应的对象,在这里我通过关键字[code="python"]b = Book.objects.get(pk=1)[/code]pk=1表示获取主键为1的对象,你也可以用其他的关键字参数,Book.objects.filter(关键字参数)也是一个很好的方法;第三步,就可以更改属性了,[code="python"]b.temp=[44,7,16,8][/code]最后一步:保存修改,[code="python"]b.save()[/code]
第二个问题,流程基本如下
[code="python"]
from myproject.myapp.models import Book
b = Book.objects.get(pk=1)
url1 = b.temp[0]
url2 = b.temp[1]
url3 = b.temp[2]
//自己处理
[/code]
这些操作可以在shell下操作一下,在应用程序的当前目录运行./manage.py shell 进入shell,其他步骤同上,很方便的 :D
我好像懂了lz的意思了,现在给出不修改数据库的方案:Django是没有list的field,lz用TextField类型的变量存储
[code="python"]
from myproject.myapp.models import Book
b = Book.objects.get(pk=1)
[/code]这样得到的b.temp就是一个字符串而不是一个list,我们可以使用内置的eval和repr函数在原对象和它的字符串表示形式之间相互转化,请看代码
[code="python"]
s = repr([44,7,16,8]) #将对象表示成字符串形式
s
'[44, 7, 16, 8]'
eval(s) #用对象的字符串形式重建对象
[44, 7, 16, 8]
[/code]
所以,第二题答案,我们只要加一步
[code="python"]
from myproject.myapp.models import Book
b = Book.objects.get(pk=1)
L = eval(b.temp)
url1 = L.temp[0]
url2 = L.temp[1]
url3 = L.temp[2]
[/code]
上面的是怎么读数据,同样的,存数据时,我们可以先用list进行操作,然后再用repr函数转换为字符串形式村到TextField类型的变量里。
:D 看看行不行
有一些细节,我先说一下:
1、pgm_url字段有现成的变量类型URLField用来存储URL,本身添加了一些验证,lz用了CharField可以换成URLField;
2、不知楼主是怎么保证Photo.objects.all()[:len(list)] 和 matches里面的数据是对应的,这里我给出两种方法:
第一种,设定QuerySet默认的排序方式[code="python"]
class Photo(models.Model):
//...
class Meta:
ordering = ['字段变量名']
[/code]
第二种,返回QuerySet对象时通过order_by方法指定
[code="python"]
Photo.objects.all().order_by('字段变量名')
[/code]
下面假设顺序是对应的,返回最佳匹配对象的代码如下:
[code="python"]
//假设当前图片对象为p
L = eval(p.matches) #转换为list对象
maxval, maxpos = max([ (L[i], i) for i in range(len(L)) ])#最大的匹 配数及其位置
mp = Photo.objects.all()[maxpos] #对应的图片对象
//TO DO
[/code]
不好意思,方案2也得先排序, :D ,要不就找不到最佳匹配的图片了,用list推导式就不太合适了,你可以用循环代替,这样可以使用break退出循环,这样最后一个满足条件的元素之后的元素就不用比较了
:D 应该是一些细节问题,你再看看吧