SORU
10 Temmuz 2009, Cuma


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
11 Temmuz 2009, CUMARTESİ


"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()

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kidrauhl

    kidrauhl

    15 Ocak 2007
  • Menglong Tav

    Menglong Tav

    18 Temmuz 2010
  • Video Copilot

    Video Copilo

    21 EYLÜL 2006