Django如何生成过滤查询集
我有两个模型。资产和资产类型。在我的资产类型详细视图中,我想列出该资产类型的所有资产。我想我必须使用models.Asset.queryset().filter(),但我无法让它工作 在我的模板上,我想用一个'for'(例如:列表中的对象)循环遍历列表,并像这样打印值{{object.name} 型号.pyDjango如何生成过滤查询集,django,filter,django-queryset,Django,Filter,Django Queryset,我有两个模型。资产和资产类型。在我的资产类型详细视图中,我想列出该资产类型的所有资产。我想我必须使用models.Asset.queryset().filter(),但我无法让它工作 在我的模板上,我想用一个'for'(例如:列表中的对象)循环遍历列表,并像这样打印值{{object.name} 型号.py class Asset(models.Model): # Relationships room = models.ForeignKey(&q
class Asset(models.Model):
# Relationships
room = models.ForeignKey("asset_app.Room", on_delete=models.SET_NULL, blank=True, null=True)
model_hardware = models.ForeignKey("asset_app.Model_hardware", on_delete=models.SET_NULL, blank=True, null=True)
# Fields
name = models.CharField(max_length=30)
serial = models.CharField(max_length=30, unique=True, blank=True, null=True, default=None)
mac_address = models.CharField(max_length=30, null=True, blank=True)
purchased_date = models.DateField(null=True, blank=True)
may_be_loaned = models.BooleanField(default=False, blank=True, null=True)
notes = models.TextField(max_length=448, null=True, blank=True)
ip = models.CharField(max_length=90, null=True, blank=True)
created = models.DateTimeField(auto_now_add=True, editable=False)
last_updated = models.DateTimeField(auto_now=True, editable=False)
class Meta:
ordering = ["name"]
def __str__(self):
return str(self.name)
def get_absolute_url(self):
return reverse("asset_app_asset_detail", args=(self.pk,))
def get_update_url(self):
return reverse("asset_app_asset_update", args=(self.pk,))
class Asset_type(models.Model):
# Fields
name = models.CharField(max_length=30)
last_updated = models.DateTimeField(auto_now=True, editable=False)
created = models.DateTimeField(auto_now_add=True, editable=False)
notes = models.TextField(max_length=448, null=True, blank=True)
class Meta:
ordering = ["name"]
def __str__(self):
return str(self.name)
def get_absolute_url(self):
return reverse("asset_app_asset_type_detail", args=(self.pk,))
def get_update_url(self):
return reverse("asset_app_asset_type_update", args=(self.pk,))
class Model_hardware(models.Model):
# Relationships
asset_type = models.ForeignKey("asset_app.Asset_type", on_delete=models.SET_NULL, blank=True, null=True)
brand = models.ForeignKey("asset_app.Brand", on_delete=models.SET_NULL, blank=True, null=True)
# Fields
name = models.CharField(max_length=30)
notes = models.TextField(max_length=448, null=True, blank=True)
created = models.DateTimeField(auto_now_add=True, editable=False)
last_updated = models.DateTimeField(auto_now=True, editable=False)
class Meta:
ordering = ["name"]
def __str__(self):
return str(self.name) + " :: " + str(self.brand.name) + " :: " + self.asset_type.name
def get_absolute_url(self):
return reverse("asset_app_model_hardware_detail", args=(self.pk,))
def get_update_url(self):
return reverse("asset_app_model_hardware_update", args=(self.pk,))
class Asset_typeDetailView(generic.DetailView):
model = models.Asset_type
form_class = forms.Asset_typeForm
视图.py
class Asset(models.Model):
# Relationships
room = models.ForeignKey("asset_app.Room", on_delete=models.SET_NULL, blank=True, null=True)
model_hardware = models.ForeignKey("asset_app.Model_hardware", on_delete=models.SET_NULL, blank=True, null=True)
# Fields
name = models.CharField(max_length=30)
serial = models.CharField(max_length=30, unique=True, blank=True, null=True, default=None)
mac_address = models.CharField(max_length=30, null=True, blank=True)
purchased_date = models.DateField(null=True, blank=True)
may_be_loaned = models.BooleanField(default=False, blank=True, null=True)
notes = models.TextField(max_length=448, null=True, blank=True)
ip = models.CharField(max_length=90, null=True, blank=True)
created = models.DateTimeField(auto_now_add=True, editable=False)
last_updated = models.DateTimeField(auto_now=True, editable=False)
class Meta:
ordering = ["name"]
def __str__(self):
return str(self.name)
def get_absolute_url(self):
return reverse("asset_app_asset_detail", args=(self.pk,))
def get_update_url(self):
return reverse("asset_app_asset_update", args=(self.pk,))
class Asset_type(models.Model):
# Fields
name = models.CharField(max_length=30)
last_updated = models.DateTimeField(auto_now=True, editable=False)
created = models.DateTimeField(auto_now_add=True, editable=False)
notes = models.TextField(max_length=448, null=True, blank=True)
class Meta:
ordering = ["name"]
def __str__(self):
return str(self.name)
def get_absolute_url(self):
return reverse("asset_app_asset_type_detail", args=(self.pk,))
def get_update_url(self):
return reverse("asset_app_asset_type_update", args=(self.pk,))
class Model_hardware(models.Model):
# Relationships
asset_type = models.ForeignKey("asset_app.Asset_type", on_delete=models.SET_NULL, blank=True, null=True)
brand = models.ForeignKey("asset_app.Brand", on_delete=models.SET_NULL, blank=True, null=True)
# Fields
name = models.CharField(max_length=30)
notes = models.TextField(max_length=448, null=True, blank=True)
created = models.DateTimeField(auto_now_add=True, editable=False)
last_updated = models.DateTimeField(auto_now=True, editable=False)
class Meta:
ordering = ["name"]
def __str__(self):
return str(self.name) + " :: " + str(self.brand.name) + " :: " + self.asset_type.name
def get_absolute_url(self):
return reverse("asset_app_model_hardware_detail", args=(self.pk,))
def get_update_url(self):
return reverse("asset_app_model_hardware_update", args=(self.pk,))
class Asset_typeDetailView(generic.DetailView):
model = models.Asset_type
form_class = forms.Asset_typeForm
您可以使用默认的相关名称,即附加了
\u set
的小写模型名称,简单地迭代模板中的相关对象。因此,asset\u type.model\u hardware\u set.all()
将为您提供所有与asset\u type
相关的model\u hardware.asset\u set.all()的实例:
但这可能会变得很慢,因为我们会遇到N+1问题,即对于每个型号的硬件,我们都会进行查询以获取其资产。我们可以在您的模型实例上使用此选项预取所有相关对象(在更少的查询中),并使其更快:
from django.db.models import prefetch_related_objects
from django.views.generic import DetailView
class YourDetailView(DetailView):
model = Asset_type
template_name = '<your_template_name>.html'
def get_object(self, queryset=None):
obj = super().get_object(queryset=queryset)
prefetch_related_objects([obj], 'model_hardware__asset')
return obj
从django.db.models导入预取相关对象
从django.views.generic导入详细视图
类YourDetailView(DetailView):
模型=资产类型
模板名称='.html'
def get_对象(self,queryset=None):
obj=super().get_对象(queryset=queryset)
预回迁\u相关\u对象([obj],“模型\u硬件\u资产”)
返回obj
注意:python中的类名理想情况下应该是PascalCase
而不是某些情况下的类名(不要认为有任何您所做的约定)
此处),因此ModelHardware
而不是Model\u hardware
和
AssetType
而不是Asset\u type
将是更好的名称
该指南可能对您有所帮助。资产
和资产类型
之间没有关系吗?您需要一个ForeignKey
从Asset
到Asset\u type
@AbdulAzizBarkat我忘了给您看class Model\u硬件(models.Model),我会更正我的类名。感谢您的提示:-)我是否不能通过这样做来订购我的queryset:obj=super().get_对象(queryset=queryset.order_by('asset_type'、'brand'、'model_hardware'、'name'))@Reventlow是的,您可以这样做,或者如果您愿意,您可以替代它(但按4列排序?请注意,您在顺序中添加的列越多,数据库需要做的工作就越多)