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如果我的答案有帮助,请投赞成票