Django model bir listesini saklamak için en verimli yolu nedir?
Şu anda benim kod python nesneleri bir sürü aşağıdakine benzer:
class MyClass():
def __init__(self, name, friends):
self.myName = name
self.myFriends = [str(x) for x in friends]
Şimdi, nerede model Django kendini içine bu çevirmek istiyorum.myName string alan ve öz bir.arkadaşlarımla dizeleri bir listesini.
from django.db import models
class myDjangoModelClass():
myName = models.CharField(max_length=64)
myFriends = ??? # what goes here?
Listeyi python böyle bir ortak bir veri yapısı olduğundan, ben sıralama için Django model bir alan olması bekleniyor. ManyToMany veya OneToMany ilişki kullanabilirim biliyorum ama kodda ekstra yönlendirme olmamasını umuyordum.
Düzenleme:
Bu insanlar yararlı olabilecek related question, ekledim.
CEVAP
"Prematüre optimizasyonu tüm kötülüklerin köküdür."
Akılda sıkıca, yapalım şunu! Uygulamalar belirli bir noktaya isabet sonra, denormalizing veri çok yaygındır. Doğru şekilde yapılırsa, biraz daha temizlik maliyetle çok sayıda pahalı veritabanı aramaları kaydedebilirsiniz.
Geri dönmek için list
arkadaş bir isim erişirken bir liste döndürecektir özel Django Alan bir sınıf oluşturmanız gerekir.
David Cramer posted an guide to creating a SeperatedValueField on his blog. İşte kod:
from django.db import models
class SeparatedValuesField(models.TextField):
__metaclass__ = models.SubfieldBase
def __init__(self, *args, **kwargs):
self.token = kwargs.pop('token', ',')
super(SeparatedValuesField, self).__init__(*args, **kwargs)
def to_python(self, value):
if not value: return
if isinstance(value, list):
return value
return value.split(self.token)
def get_db_prep_value(self, value):
if not value: return
assert(isinstance(value, list) or isinstance(value, tuple))
return self.token.join([unicode(s) for s in value])
def value_to_string(self, obj):
value = self._get_val_from_obj(obj)
return self.get_db_prep_value(value)
Bu kod mantığı ve Python veritabanı ve vize-versa değerleri seri kaldırmada ile ilgilenir. Şimdi ve model sınıfında özel alanı içe kullanabilirsiniz:
from django.db import models
from custom.fields import SeparatedValuesField
class Person(models.Model):
name = models.CharField(max_length=64)
friends = SeparatedValuesField()
Bir ağaca doğru düz bir masa ayrıştırm...
Bir veritabanında etiketleri saklamak ...
En yüksek set bit (msb) C bir tam sayı...
Bir SQLite tablo Django kullanarak bin...
Bir nesneyi klonlamak için en etkili y...