在我的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
吗?我需要能够基于两个条件过滤该下拉菜单。
Reviews
模型中状态为已批准的记录。
Reviews.objects.filter(status="approved")
File
模型的记录中。
File.objects.all()
而且,在创建File模型的实例时,从下拉列表中选择一个值时,如何使用Review模型的注释字段中的值自动填充comment field
?
我不太清楚。
答案 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)