Django моделирует отношения

#python #django #django-models

#python #django #django-модели

Вопрос:

Я создаю приложение, в котором люди размещают объявления о продаже разных вещей, таких как автомобили, квартиры, гаджеты и т.д. У меня есть модели со своими собственными специальными полями для каждого элемента, такими как: CarModel, ApartmentModel, SmartphoneModel и т.д…

И у меня есть статья о модели: и я хочу добавить поле item_of_sale, которое может быть экземпляром разных моделей (например, CarModel или ApartmentModel).

 class Article(models.Model):

author = 
    models.ForeignKey(User,on_delete=models.CASCADE,related_name='articles' )
    category = models.ForeignKey(Category,on_delete=models.CASCADE )        
    title = models.CharField(max_length=120)
    text = models.TextField()

    item_of_sale = # ??????? models.OneToOneField I suppose
  

Я пытаюсь что-то вроде этого:

 class CarModel(models.Model):
   ad = models.OneToOneField(Article, on_delete=models.CASCADE, 
                             related_name='item_of_sale')
   marc = models.CharField(max_length=40, choices=MARC_CHOICES)
   model = models.CharField(max_length=120, default='')
   .....


class ApartmentModel(models.Model):
   ad = models.OneToOneField(Article, on_delete=models.CASCADE, 
                             related_name='item_of_sale')
   location= models.CharField(max_length=200 )
   address= models.CharField(max_length=120)
   .....
  

Но django не позволяет иметь более одной модели с related_name=»item_of_sale» .

Есть ли у вас какие-либо идеи, как я могу создать базу данных с такими отношениями. Пожалуйста, любая помощь. Заранее благодарю вас.

Комментарии:

1. Вам нужно прочитать о типах отношений … есть не только взаимно однозначные… вы можете использовать «один ко многим» или «многие ко многим»… Попробуйте прочитать эту статью или документы

2. Надеюсь, ваш проект получится отличным ^_ ^

3. @Kendoka ваша первая ссылка действительно помогает мне. ** Полиморфные отношения «Один ко многим» ** из ** django-полиморфный пакет ** — это то, что я искал. Спасибо. Если вы хотите добавить его в качестве ответа, я проверю его как принятый.

Ответ №1:

связанное имя предназначено для обратного запроса. смягченное имя является необязательным, поле, связанное с ним, должно быть уникальным. ваша модель очень проста, вам не нужно никакого связанного имени. `определите свою модель без связанного имени. .