2012-02-24 1 views
0

Некоторое поведение, которое я не могу объяснить:
Я следую учебнику djangobook.com и подключил простую устаревшую базу данных mysql.
Я определил модель, как это:Аналогично определенные классы модели django имеют странное поведение

class Sentences(models.Model): 
    sentenceid = models.IntegerField(primary_key=True) 
    sentence = models.TextField(blank=True) 
    class Meta: 
     db_table = u'sentences' 

    def __unicode__(self): 
     return unicode(self.sentence) 

class Character(models.Model): 
    charid = models.IntegerField(primary_key=True) 
    symbol = models.TextField(blank=True) 
    class Meta: 
     db_table = u'characters' 

    def __unicode__(self): 
     return unicode(self.symbol) 

Довольно стандартные вещи.

Я проверяю доступ к нему через оболочку. Символы возвращаются красиво, но предложения действуют странно, несмотря на то, что они определены (как я думаю) точно так же.

>>> from myapp.models import Character 
>>> c = Character.objects.filter(charid=70) 
>>> c 
[<Character: β>] 

Это идеальный вариант, но:

>>> from myapp.models import Sentences 
>>> s = Sentences.objects.get(sentenceid=25) 
>>> s 
<Sentences: Sentences object> 
>>> print s 
Sentences object 
>>> print s.sentence 
The quick brown fox jumps over the lazy dog. 

Почему не будет ли он вернуть предложение в первом случае Почему я должен использовать s.sentence вместо?
Это слишком долго?
Я обнаружил, что s.sentence работает случайно.

ответ

0

ОБНОВЛЕНИЕ: У вас есть еще одна проблема. Здесь, с кода модели:

class Sentences(models.Model): 
    sentenceid = models.IntegerField(primary_key=True) 
    sentence = models.TextField(blank=True) 
    class Meta: 
     db_table = u'sentences' 

    def __unicode__(self): 
     return unicode(self.sentence) 

__unicode__ работает отлично:

In [1]: from testapp.models import Sentences 

In [2]: Sentences(sentence='foo').save() 
DEBUG (0.000) INSERT INTO "sentences" ("sentenceid", "sentence") VALUES (None, foo); args=(None, 'foo') 

In [3]: Sentences.objects.all() 
DEBUG (0.000) SELECT "sentences"."sentenceid", "sentences"."sentence" FROM "sentences" LIMIT 21; args=() 
Out[3]: [<Sentences: foo>] 

Другой попробовать с более предложением:

In [1]: from testapp.models import Sentences 

In [2]: Sentences(sentence='The quick brown fox jumps over the lazy dog. ').save() 
DEBUG (0.000) INSERT INTO "sentences" ("sentenceid", "sentence") VALUES (None, The quick brown fox jumps over the lazy dog.); args=(None, 'The quick brown fox jumps over the lazy dog. ') 

In [3]: Sentences.objects.all() 
DEBUG (0.000) SELECT "sentences"."sentenceid", "sentences"."sentence" FROM "sentences" LIMIT 21; args=() 
Out[3]: [<Sentences: foo>, <Sentences: The quick brown fox jumps over the lazy dog. >] 

Поэтому, пожалуйста, убедитесь, что:

  1. Вы перезагрузили оболочку После добавления UNICODE

    и е
  2. Sentences.__module__ возвращает право app.class (здесь: testapp.models)

  3. Это Sentences.__unicode__ определяется

Это работает:

In [9]: Sentences.__unicode__ 
Out[9]: <unbound method Sentences.__unicode__> 

Это не удается:

In [1]: from testapp.models import Sentences 

In [2]: Sentences.__unicode__ 
--------------------------------------------------------------------------- 
AttributeError       Traceback (most recent call last) 
/home/jpic/testproject/<ipython-input-2-dcbda9dfb929> in <module>() 
----> 1 Sentences.__unicode__ 

AttributeError: type object 'Sentences' has no attribute '__unicode__' 

END UPDATE

filter() возвращает QuerySet, который является как список объектов.Таким образом, скобки вокруг значения [<Character: β>]:

>>> Character.objects.filter(charid=70) 
[<Character: β>] 

Если вы использовали get(), вы бы непосредственно получить экземпляр Character

>>> Character.objects.get(charid=70) 
<Character: β> 

модель Характер имеет приписывать 'символ' TextField, который вы можете получить доступ, например:

>>> Character.objects.get(charid=70).symbol 
u'β' 

Вы понимаете, что это совершенно нормально, что Sentences.objects.get() возвращает одну Приговоры объект:

>>> Sentences.objects.get(sentenceid=25) 
<Sentences: Sentences object> 

Теперь ваша Приговоры модель имеет «предложение» TextField атрибут, который вы можете получить доступ, как такие как:

>>> Sentences.objects.get(sentenceid=25).sentence 
The quick brown fox jumps over the lazy dog. 

Все работает, и поведение последовательное.

+0

Спасибо за ваш ответ, но он не совсем отвечает на мой вопрос. Я действительно спросил, почему «getter» для Character возвращает , а предложения возвращают , а не с показанным предложением. Возможно, это потому, что он слишком длинный. Они определяются точно так же, поэтому должны возвращаться аналогичным образом. Я не уверен! – LittleBobbyTables

+0

Вижу, это странно. Я обновил свой ответ, может быть, что-то может помочь вам в этом. – jpic