【问题标题】:Django model attributesDjango 模型属性
【发布时间】:2016-05-02 23:18:53
【问题描述】:

当我尝试运行下面的代码时,Django 说:“名称'卡片'未定义。”

class CardSet(models.Model):

    cards = Card.objects.all()

    def show_card(self):

        for card in cards:
            print(card)

但如果我这样写代码,它就可以工作。

class CardSet(models.Model):

    def show_card(self):

        cards  = Card.objects.all()
        for card in cards :
            print(card)

你能给我解释一下吗?谢谢!

【问题讨论】:

    标签: python django class


    【解决方案1】:

    如果这是您的代码(而不是发布的至少有一个语法错误的代码):

    class CardSet(models.Model):
        cards = Card.objects.all()
        def show_card(self):
            for card in cards:
                print(card)
    

    这个有很多问题:

    1. 您不会使用Card.objects.all(),而是使用many2many 字段。有关更多详细信息,请参阅文档。否则,您的方法作为实例方法将毫无意义。
    2. 方法中的循环没有类的范围,因为该范围仅在您定义类时存在(在加载时发生,而不是在方法调用时发生)。
    3. 你的方法涉及到self,或许你想要的引用是self.cards而不是cards

    建议代码:

    class CardSet(modelsModel):
        cards = models.ManyToManyField(Card)
        def show_cards(self):
            for card in self.cards.all():
                print(card)
    

    OTOH 如果 cards 只是一个类范围的查询集而不是 m2m 关系...

    class CardSet(modelsModel):
        cards = Card.objects.all()
        def show_cards(self):
            for card in self.cards:
                print(card)
    

    解决方法基本相同:添加self

    【讨论】:

      【解决方案2】:

      使用self.cards访问它:

      def show_card(self):
          for card in self.cards:
              print (card)
      

      编辑:我看到你的另一个问题Relationships among these models in Django

      如果您保持这种关系,只需使用相关对象查询进行查询:

      cards = models.ManyToManyField(Card) # Ref. this relationship
      
      def show_card(self):
          for card in self.cards.all(): # <-- querying for cards related to this
                                        # CardSet object 
              print (card)
      

      【讨论】:

      • 感谢您的即时答复。你们俩都给了我宝贵的帮助。很难决定哪一个是最好的答案,我选择了 Lui's 因为他的分数比你少。希望你不要介意! '
      猜你喜欢
      • 2016-03-17
      • 2012-06-16
      • 2017-08-05
      • 2017-08-15
      • 2015-10-24
      • 2018-12-12
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      相关资源
      最近更新 更多