【问题标题】:Similarly defined django model classes have weirdly different behavior类似定义的 django 模型类具有奇怪的不同行为
【发布时间】:2012-03-15 08:48:44
【问题描述】:

一些我无法真正解释的行为:
我正在关注 djangobook.com 教程并连接了一个简单的旧版 mysql 数据库。
我已经这样定义了模型:

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)

相当标准的东西。

我正在测试通过 shell 访问它。人物的回归很漂亮,但句子的行为却很奇怪,尽管(我认为是)以完全相同的方式定义。

>>> 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的作品。

【问题讨论】:

    标签: mysql django unicode legacy


    【解决方案1】:

    更新:您还有另一个问题。在这里,使用您的模型代码:

    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 定义后重新启动了 shell

    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__'
    

    结束更新

    filter() 返回一个QuerySet,类似于对象列表。因此值 [&lt;Character: β&gt;] 周围的括号:

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

    如果你使用get(),你会直接获取 Character 实例

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

    Character 模型有一个“符号”TextField 属性,您可以访问它,例如:

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

    您知道Sentences.objects.get() 返回单个Sentences 对象是完全正常的

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

    现在,您的 Sentences 模型有一个“句子”TextField 属性,您可以这样访问它:

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

    一切正常,行为一致。

    【讨论】:

    • 感谢您的回复,但它并没有完全回答我的问题。我真的问为什么 Character 的“getter”返回 而句子一返回 而不是显示的句子。也许这是因为它太长了。它们以完全相同的方式定义,因此应该以类似的方式返回。我不确定!
    • 我明白了,这很奇怪。我更新了我的答案,也许可以帮助你。
    猜你喜欢
    • 2016-08-22
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2017-03-29
    • 1970-01-01
    • 2016-10-24
    相关资源
    最近更新 更多