Skip to main content
 首页 » 编程设计

python之在 Django 中调用添加集中的字段

2025年05月04日43jyk

我正在尝试将名为 BlockContent 的模型中的字段添加到 Block。

    block_list = Block.objects.filter(lesson=int(num)) 
 
    # For each block, fill the stuff inside of the latest revision: 
    for block in block_list: 
        additional = BlockContent.objects.filter(block=block.id).latest('id') 
        block.blockcontent_set.add(additional) 
        print("check: ", block.content) 

这一直在抛出

'Block' object has no attribute 'content' 

我猜这与我调用模型的方式有关,但我似乎无法理解它。我尝试了几种不同的组合(例如 block.blockcontent_set.content 和 block.blockcontent.content),但都没有成功。

目的:尝试将其放入一个易于使用的变量中,以传递到模板中的 for 循环中。


class Block(models.Model): 
    lesson = models.ForeignKey('Lesson') 
    name = models.CharField(max_length=100) 
 
class BlockContent(models.Model): 
    block = models.ForeignKey('Block') 
    content = models.TextField() 
    type = models.IntegerField(default=1) 
    revision = models.IntegerField(default=0) 
    latest = models.BooleanField(default=True) 

请您参考如下方法:

在当前模型中,Block 模型类和 BlockContent 模型类之间存在多对一关系,更改代码以解决错误:

block_list = Block.objects.filter(lesson=int(num)) 
 
# For each block, fill the stuff inside of the latest revision: 
for block in block_list: 
    additional = BlockContent.objects.filter(block=block.id).latest('id') 
    block.blockcontent_set.add(additional) 
    # The block.blockcontent_set contains multiple BlockContent objects 
    for block_content in block.blockcontent_set.all(): 
        print("check: ", block_content.content) 

此外,如果你想在 Block 和 BlockContent 之间建立一对一关系,请更改 中 block 属性的类型BlockContent 类到 OneToOneField:

class BlockContent(models.Model): 
    block = models.OneToOneField('Block') 
    content = models.TextField() 
    type = models.IntegerField(default=1) 
    revision = models.IntegerField(default=0) 
    latest = models.BooleanField(default=True) 

然后在使用block 对象时必须使用blockcontent 而不是blockcontent_set。

如果你想简单的在Block类中使用BlockContent类的content属性,你可以添加一个属性到Block 类,类似如下:

class Block(models.Model): 
    lesson = models.ForeignKey('Lesson') 
    name = models.CharField(max_length=100) 
 
    @property 
    def contents(self): 
        return [bc.content for bc in self.blockcontents_set.all()] 

然后你可以使用:

{% for content in block.contents %} 
    <span>{{ content }}</span> 
{% endfor %} 

代替:

{% for bc in block.blockcontent_set.all %} 
    <span>{{ bc.content }}</span> 
{% endfor %}