将一个查询集的结果与另一查询集的结果进行比较

时间:2019-02-21 04:06:58

标签: python django django-models

在我的django应用程序中,我有三种模型,人员,评论和文件。

class People(models.Model):
  firstname = models.charField(max_length=20)
  lastname = models.charField(max_length=20)

class Reviews(models.Model):
  STATUSES = (
    ('pending', 'Pending'),
    ('approved', 'Approved'),
    ('rejected', 'Rejected')
  )
  person = models.OneToOneField(People, on_delete=models.CASCADE, primary_key=True)
  status = models.CharField(max_length=10, choices=STATUSES, default='pending')
  comment = models.TextField()

class File(models.Model):
  owner = models.OneToOneField(Reviews, on_delete=models.CASCADE, primary_key=True)
  comment = models.TextField()
  issue_date = models.DateField(auto_now_add=True)

看到文件模型上的OneToOneField吗?我需要能够基于两个条件过滤该下拉菜单。

  1. 它仅需要显示Reviews模型中状态为已批准的记录。 Reviews.objects.filter(status="approved")
  2. 显示的结果必须不存在于File模型的记录中。  File.objects.all()

而且,在创建File模型的实例时,从下拉列表中选择一个值时,如何使用Review模型的注释字段中的值自动填充comment field

我不太清楚。

1 个答案:

答案 0 :(得分:2)

我认为您可以尝试这样:

Reviews.objects.filter(status="approved", file__isnull=True)

在这里由于OneToOne的关系,所有评论对象都有一个file属性,该属性返回一个File对象。我正在使用isnull检查它是否为空。

更新

恕我直言,我不明白为什么注释的值应该在数据库中存储两次。如果您在Review中有注释值,则可以这样访问它:

file = File.objects.first()
comment = file.review.comment

现在,当涉及在创建文件实例时在管理站点中显示它时,如果不使用Javascript就无法做到这一点。但是另一种骇人听闻的方法是在评论下拉列表中显示该值。但是为此,您需要重写Review Model的__str__方法。像这样:

class Reviews(models.Model):
  STATUSES = (
    ('pending', 'Pending'),
    ('approved', 'Approved'),
    ('rejected', 'Rejected')
  )
  person = models.OneToOneField(People, on_delete=models.CASCADE, primary_key=True)
  status = models.CharField(max_length=10, choices=STATUSES, default='pending')
  comment = models.TextField()

  def __str__(self):
     return "{}: {}".format(self.status, self.comment)

但是,如果创建了文件实例,或者要在管理站点的文件列表中显示注释,则可以这样操作:

from django.contrib import admin

class FileAdmin(admin.ModelAdmin):
    list_display = ('issue_date', 'comment')

    def comment(self, obj):
        return obj.review.comment

admin.site.register(File, FileAdmin)