如何在很多对很多Django中列出对象

时间:2015-06-16 02:35:58

标签: django many-to-many django-queryset

考虑这个模型

class Dealership(models.Model):
    dealership = models.CharField(max_length=50)

class Ordered(models.Model):
    customer = models.ForeignKey("Customer")
    dealership = models.ManyToManyField("Dealership")
    status = models.CharField(max_length=2, choices=status_list, default='p')

我试试

$ ./manage.py shell
>>> from new_way.core.models import Ordered, Dealership
>>> q = Ordered.objects.all()[:5]
>>> [i.dealership for i in q.dealership.all]

并生成错误

Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'QuerySet' object has no attribute 'dealership'

如何返回

Ordered.dealership.dealership

Ordered的所有经销商。

2 个答案:

答案 0 :(得分:4)

你非常接近:

变化:

[i.dealership for i in q.dealership.all]

为:

[dealership for dealership in q.dealership.all()]

这是我的一个模型的M2M关系中的示例输出,该项目展示了您应该从列表理解中看到的内容。 shared_with是名为Profile的模型的M2M字段:

>>> from polls.models import Poll
>>> polls = Poll.objects.all()
>>> for p in polls:
...   print([sw for sw in p.shared_with.all()])
... 
[<Profile: kerri>]
[<Profile: kerri>]
[]
[<Profile: jake>, <Profile: kerri>]
[<Profile: jake>, <Profile: kerri>]
[<Profile: jake>, <Profile: kerri>]
[<Profile: btaylor>]
[<Profile: jake>, <Profile: kerri>]

答案 1 :(得分:2)

应该是:

 require_once 'includes/config.php';
require_once 'includes/Database.php';

 $pdo = new PDO(HOST,USER,PASSWORD);
 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$connectdb = new Database($pdo);

$rows = $connectdb->getData();

 $page = $_GET['page'];
 $per_page = 5;

$pages = ceil( $rows / $per_page );

if($page == 0)
   $start = 0;
else
   $start = ( $page - 1 ) * $per_page;

$data =  $connectdb->display($start,$per_page);
?>
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
      <script type="text/javascript" src="js/bootstrap.min.js"></script>
        <script type="text/javascript">

        $(function () {
            var pages = '<?php echo $pages;?>';
            $('#mylist-ul').twbsPagination({
               totalPages: pages,
              visiblePages: 7,

          href: '?page={{number}}'
            });
        }); 

        </script>

    </head>
    <body>
       <div class="wrapper">
         <?php echo $data ?>
        <ul class="list-group" id="mylist-ul"></ul>
       </div>
    <script type="text/javascript" src="js/bootstrap.min.js"></script>
       <script type="text/javascript" src="js/jquery.twbsPagination.min.js"></script>
    </body>
    </html>

您可以直接执行此操作,而不是使用列表推导(在上面的ans中)。

示例:(取自docs

q.dealership.all() #gives a list of objects 

制作一些出版物:

from django.db import models

class Publication(models.Model):
    title = models.CharField(max_length=30)

    def __str__(self):              # __unicode__ on Python 2
        return self.title

    class Meta:
        ordering = ('title',)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication)

    def __str__(self):              # __unicode__ on Python 2
        return self.headline

    class Meta:
        ordering = ('headline',)

现在,创建p1 = Publication(title='The Python Journal') p1.save() p2 = Publication(title='Science News') p2.save() p3 = Publication(title='Science Weekly') p3.save() 并将ArticleArticle相关联:

Publication