django узнать, какая подмодель связана с основной моделью - PullRequest
0 голосов
/ 08 января 2020

У меня есть модель с именем Animal, и есть несколько моделей, которые имеют Animal как OneToOneField

class Animal(models.Model):
    name = models.CharField(max_length=20)
    description = models.TextField()

class Cat(models.Model):
    animal = models.OneToOneField(Animal, on_delete=models.CASCADE)
    name = models.CharField(max_length=20)

class Dog(models.Model):
    animal = models.OneToOneField(Animal, on_delete=models.CASCADE)
    name = models.CharField(max_length=20)

class Lion(models.Model):
    animal = models.OneToOneField(Animal, on_delete=models.CASCADE)
    name = models.CharField(max_length=20)

(примечание: имеется 50 подмоделей) Только при создании объявления, поэтому он будет связан только с одним из 50 автомобилей, лодок или грузовиков субмодели, поэтому после этого я создаю представление для отображения имени животного, но как узнать, какая субмодель связана с объявлением, чтобы получить от него данные? .

def get_ad_details(request, id):
    animal = Animal.objects.get(id=id)

    #need to call a method to get a boat or car or truck or .... that is associated to the ad so how?

1 Ответ

1 голос
/ 08 января 2020

Один из возможных способов - использовать наследование модели, а затем использовать InheritanceManager из django-model-utils пакета .

Если вы не хотите этого делать, вы можете взглянуть на его код для вдохновения. По сути, вам нужно циклически бросать каждое возможное связанное поле, чтобы увидеть, какое из них установлено, поэтому в вашем примере это будет что-то вроде:

def get_ad_details(request, id):
    possible_related_models = ['car', 'boat', 'truck']
    ad = Ad.objects.get(id=id).select_related(possible_related_models)  # select_related prevents one query for each model afterwards

    #need to call a method to get a boat or car or truck or .... that is associated to the ad so how?
    relboject = None
    for relmodel in possible_related_models:
        relobject = getattr(ad, relmodel, None)
        if relobject:
            break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...