【问题标题】:Display model and its relations显示模型及其关系
【发布时间】:2013-03-02 06:55:42
【问题描述】:

我的models.py如下:

from django.db import models

class Book(models.Model):
    book_id=models.AutoField(primary_key=True,unique=True)
    book_name=models.CharField(max_length=30)
    author_name=models.CharField(max_length=30)
    publisher_name=models.CharField(max_length=40)
    def __unicode__(self):
        return "%d %s %s %s" % (self.book_id,self.book_name, self.author_name,self.publisher_name)


class Author(models.Model):
    author_id=models.AutoField(primary_key=True)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()
    age=models.IntegerField()
    book=models.ForeignKey(Book)

    def __unicode__(self):
        return u'%d %s %s' % (self.author_id,self.first_name, self.last_name)

我的views.py是这样的:

def index(request):

    books = Book.objects.all()
    context={'books':books}
    return render(request,'index.html', context)

上面的views.py显示了Book类中的内容,但是我无法显示author表中的内容。我的要求是在一个页面中显示合并的两个内容。请帮我做这件事。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    嗯,看起来您一开始就正确设置了模型。如果没有提供 id,Django 会处理,所以你不需要author_id=models.AutoField(primary_key=True)。另外,一本书不应该有作者,而不是作者有书吗?如果你做得对,你也不需要author_name=models.CharField(max_length=30),因为你的作者模型会有一个外键,它有他们的名字。

    一旦正确设置它们,就可以很容易地访问模板中的数据。例如,您可以在模板中使用book.author.first_name 来获取图书作者的姓名。


    from django.db import models
    
    class Author(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=40)
        email = models.EmailField()
        age = models.IntegerField()
    
        def __unicode__(self):
            return u'%d %s %s' % (self.pk, self.first_name, self.last_name)
    
    class Book(models.Model):
        name = models.CharField(max_length=30)
        author = models.ForeignKey(Author)
        publisher_name = models.CharField(max_length=40)
    
        def __unicode__(self):
            return u"%d %s %s %s" % (self.pk, self.name, self.author.name, self.publisher_name)
    

    模板

    {% for book in books %}
        ...
        {% for author in book.author_set %}
            ...
        {% endfor %}
    {% endfor %}
    

    【讨论】:

      【解决方案2】:

      models.py

      class Book(models.Model):
          book_name=models.CharField(max_length=30)
          author_name=models.CharField(max_length=30)
          publisher_name=models.CharField(max_length=40)
          author=models.ForeignKey(Author)
      
          def __unicode__(self):
              ..........
      
      class Author(models.Model):
          first_name = models.CharField(max_length=30)
          last_name = models.CharField(max_length=40)
          email = models.EmailField()
          age=models.IntegerField()
      
          def __unicode__(self):
              ........
      
          def books(self):
              return Book.objects.filter(author=self)
      

      views.py

      def index(request):
          authors = Author.objects.all()
          context={'authors':authors}
          return render(request,'index.html', context)
      

      模板

      {% for author in authors %}
          Author: {{author.first_name}} {{author.last_name}}<br/>
          Email: {{author.email}}
          Age: {{author.age}}
          Books:
              {% for book in author.books %}
                  .......
              {% endfor %}
      {% endfor %}
      

      【讨论】:

      • 书籍:{% for book in author.books %} ....... {% endfor %} {% endfor %}
      • 是的,为什么?这解释了一位作者有很多书。我错了吗?
      猜你喜欢
      • 2013-07-04
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多