Python Django:使用模型继承时如何检查对象类别?
这是我的Python Django:使用模型继承时如何检查对象类别?,python,django,Python,Django,这是我的models.py应用程序的理念是让不同的对象(餐厅、服务等)具有不同的功能(您可以检查每个模型)。但是当我想获取所有对象时,我不知道每个对象的类别是什么 models.py: from django.db import models from users.models import ProfileUser from django.utils import timezone # Create your models here. class City(models.Model):
models.py
应用程序的理念是让不同的对象(餐厅、服务等)具有不同的功能(您可以检查每个模型)。但是当我想获取所有对象时,我不知道每个对象的类别是什么
models.py:
from django.db import models
from users.models import ProfileUser
from django.utils import timezone
# Create your models here.
class City(models.Model):
name = models.CharField(max_length=20)
def __str__(self):
return f"{self.name}"
class Object(models.Model):
author = models.ForeignKey(ProfileUser, on_delete=models.CASCADE)
title = models.CharField(max_length=300)
city = models.ForeignKey(City, on_delete=models.CASCADE)
address = models.CharField(max_length=300)
phone = models.CharField(max_length=20, default='')
email = models.CharField(max_length=100, default='')
site = models.CharField(max_length=100, default='')
facebook = models.CharField(max_length=100, default='')
instagram = models.CharField(max_length=100, default='')
content = models.TextField()
rating = models.IntegerField(default=10)
created_date = models.DateTimeField(default=timezone.now)
approved_object = models.BooleanField(default=False)
admin_seen = models.BooleanField(default=False)
def __str__(self):
return f"{self.title}"
class Restaurant(Object):
seats = models.IntegerField()
bulgarian_kitchen = models.BooleanField(default=False)
italian_kitchen = models.BooleanField(default=False)
french_kitchen = models.BooleanField(default=False)
is_garden = models.BooleanField(default=False)
is_playground = models.BooleanField(default=False)
class SportFitness(Object):
is_fitness_trainer = models.BooleanField(default=False)
class CarService(Object):
is_parts_clients = models.BooleanField(default=False)
class BeautySalon(Object):
is_hair_salon = models.BooleanField(default=False)
is_laser_epilation = models.BooleanField(default=False)
class FastFood(Object):
is_pizza = models.BooleanField(default=False)
is_duner = models.BooleanField(default=False)
is_seats = models.BooleanField(default=False)
class CarWash(Object):
is_external_cleaning = models.BooleanField(default=False)
is_internal_cleaning = models.BooleanField(default=False)
is_engine_cleaning = models.BooleanField(default=False)
class Fun(Object):
is_working_weekend = models.BooleanField(default=False)
is_kids_suitable = models.BooleanField(default=False)
class Other(Object):
is_working_weekend = models.BooleanField(default=False)
class Comment(models.Model):
object = models.ForeignKey(Object, on_delete=models.CASCADE, related_name='comments')
author = models.ForeignKey(ProfileUser, on_delete=models.CASCADE)
content = models.TextField()
rating = models.TextField()
created_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return f"{self.content}"
无法使用对象模型获取类别。 对象类是为特定目的创建的: 它无需声明类的某些特征 在这里,您可以使用select_related或PERFICT_related获得所需的输出 或 为了满足您的需求,您可以使用django Polymopic了解更多详细信息,您可以查看文档。我就是这样做的: 基于我实现的@wfehr commond和@Lokesh Pathak answer,还为每个模型添加了两行(列)(目前仅适用于餐厅),因此当foreach覆盖所有对象时,我可以打印类别的确切名称,并添加了其他字段
category_en_name = models.CharField(max_length=100, default='restaurants')
category_bg_name = models.CharField(max_length=100, default='Ресторант')
完整的型号.py
:
from django.db import models
from users.models import ProfileUser
from django.utils import timezone
from polymorphic.models import PolymorphicModel
# Create your models here.
class City(models.Model):
name = models.CharField(max_length=20)
def __str__(self):
return f"{self.name}"
class Object(PolymorphicModel):
author = models.ForeignKey(ProfileUser, on_delete=models.CASCADE)
title = models.CharField(max_length=300)
city = models.ForeignKey(City, on_delete=models.CASCADE)
address = models.CharField(max_length=300)
phone = models.CharField(max_length=20, default='')
email = models.CharField(max_length=100, default='')
site = models.CharField(max_length=100, default='')
facebook = models.CharField(max_length=100, default='')
instagram = models.CharField(max_length=100, default='')
content = models.TextField()
rating = models.IntegerField(default=10)
created_date = models.DateTimeField(default=timezone.now)
approved_object = models.BooleanField(default=False)
admin_seen = models.BooleanField(default=False)
def __str__(self):
return f"{self.title}"
class Restaurant(Object):
seats = models.IntegerField()
bulgarian_kitchen = models.BooleanField(default=False)
italian_kitchen = models.BooleanField(default=False)
french_kitchen = models.BooleanField(default=False)
category_en_name = models.CharField(max_length=100, default='restaurants')
category_bg_name = models.CharField(max_length=100, default='Ресторант')
is_garden = models.BooleanField(default=False)
is_playground = models.BooleanField(default=False)
class SportFitness(Object):
is_fitness_trainer = models.BooleanField(default=False)
因此,我只能在views.py中选择餐厅:
objects = Object.objects.instance_of(Restaurant)
在模板中,我可以显示每个餐厅的类别名称:
{% for object in objects %}
{{ object.category_bg_name }}
{% endfor %}
django多态性可能是您想要查看的东西。->对于
select_related
I应该向对象类添加额外的行(列),对于category right?@MorganFreeFarm No,如果使用django多态,您可以添加额外的行(列)。但与选择无关。例如:-Objects.Objects.select_related(“author”)在一个查询中提供“author”所在的所有表的数据。@MorganFreeFarm如果我的答案有帮助,请投赞成票