這裏可能會發生什麼是您將areas_related
存儲爲字符串。
所以你可能有像模特:
class Service(models.Model):
...
areas_related = models.CharField(max_length=<length_here>)
,然後在你做這個的觀點:
def foo_view(request, ...):
...
service = <retrieve Service here>
areas_related = request.POST.getlist('areas_related')
service.areas_related = areas_related
service.save()
...
那麼到底是怎麼回事這裏是request.POST.getlist('areas_related')
返回Python列表。然後,您將該值存儲到模型的字符串字段中。因此,Django試圖將給定的列表轉換爲一個字符串,然後將其存儲在數據庫中;當您轉換Python列表爲字符串,其結果是列表的字符串表示:
>>> a = [u'foo', u'foo2']
>>> unicode(a)
u"[u'foo', u'foo2']"
爲了解決這個問題,你可以做這些事情之一:
外鍵
將所有areas_related
作爲單個字段存儲在模型中,而不是將它們存儲爲外鍵。我認爲這是一種更好的方式,因爲那樣你就可以進行SQL聚合,並且與下一個方法相比,它被認爲更加靈活。
# models.py
class AreaRelated(models.Model):
service = models.ForeignKey('Service', related_name='areas_related')
areas_related = models.CharField(max_length=<length_here>)
class Service(models.Model):
...
# views.py
def foo_view(request, ...):
...
service = <retrieve Service here>
areas_related = request.POST.getlist('areas_related')
for a in areas_related:
service.areas_related.create(areas_related=a)
...
# template
{% for service in services %}
{% for area_related in service.areas_related.all() %}
{{ area_related }}
{% endfor %}
{% endfor %}
編碼字符串
存儲列表中,通過某種方式編碼一個字符串的areas_related
模型字段,然後在檢索解碼以獲取列表。這種方法很好,因爲所有東西都存儲在一個列中的數據庫中,但是您無法對areas_related
進行任何查詢,因爲它將存儲多個值的編碼字符串,而不是一個。
# models.py
import json
class Service(models.Model):
...
areas_related = models.CharField(max_length=<length_here>)
def get_areas_related(self):
return json.loads(self.areas_related)
# views.py
import json
def foo_view(request, ...):
...
service = < retrieve Service here>
areas_related = request.POST.getlist('areas_related')
service.areas_related = json.dumps(areas_related)
service.save()
...
# template
{% for service in services %}
{% for area_related in service.get_areas_related %}
{{ area_related }}
{% endfor %}
{% endfor %}
AREA_related'如何存儲? – Hamish
你也可以向我們展示第二種情況的模板代碼。 –
@ Hamish你的意思是什麼?基本上,用戶點擊複選框,然後這些值與add = Descriptions(name = name_add,areas_related = areas_related)add.save()....然後,我想在不同的視圖中顯示所有的檢查項目,沒有任何[u'等。 – sam