首页 > 解决方案 > 根据另一个查询集 django 的结果检查一个查询集的结果

问题描述

在我的 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在 File 模型上看到了吗?我需要能够根据两个条件过滤该下拉列表。

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

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

我不太明白。

标签: pythondjangodjango-models

解决方案


我想你可以这样尝试:

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

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

更新

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

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

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

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)

推荐阅读