Несколько различных посторонних объектов в качестве "ресурсов"

Допустим, у меня есть модель, Повестка дня:

class Agenda(models.Model):
        ...
        resource_comments = models.Field...

class ResourceComment(models.Model):
        comment = models.TextField()
        resource = models.ForeignKey... | GenericRelation

Допустим, я хочу, чтобы resource_comment был одной или несколькими другими моделями, например... Restaurant, PetrolStation, CarPark с комментарием.

Так, в повестке дня встречи мы можем захотеть поговорить о конкретном ресторане и паре автозаправочных станций поблизости. Неважно, это usecase.

Как мне поступить? Должен ли я иметь отдельное поле для каждого...? Это не совсем правильно... как будто я не хочу

class Agenda(models.Model):
        ...
        restaurants = models....
        parking_lots = models..
        petrol_stations = models..
        ...

Полагаю, я мог бы иметь модель, подобную...

class Resource(models.Model):
         resource_id = Int
         resource_model = String # (e.g. Restaurant) 
         comment = String # (a comment pertaining to resource from having the agenda meeting) 

Кроме того, я чувствую себя не в своей тарелке, поскольку мне приходится вручную получать объекты... Например

get restaurants_in_agenda(self):
       ids = self.filter(resource_model="Restaurant").value_list('ids')
       return Restaurant.objects.filter(id__in=ids)

Или, это нормально?

Другим решением было бы сделать Agenda общей моделью, но я вроде как не хочу, чтобы это поле было во всех бизнес-моделях... потому что... что мне тогда делать с комментарием ресурса?

class Agenda(models.Model):
    attendants = models.ManyToManyField("base.User", related_name="agendas", blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    date = models.DateTimeField(null=True)
    text = models.TextField()

    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey("content_type", "object_id")

class OnAllBusinesses(models.Model):
      ...
      agendas = GenericRelation(Agenda)

О чем я еще думал, так это о "через", так что,

class Agenda(models.Model):
      restaurants = models.ManyToManyField(
                           "restaurant",
                           through="AgendaResource",
                           through_fields=("agenda", "restaurant"))
      ...

class AgendaResource(models.Model):
      restaurant = models.ForeignKey(...)
      agenda = models.ForeignKey(...)
      comment = models.TextField()
      ...

Но затем у меня снова есть по одному для каждого типа бизнеса...

Спасибо за любую помощь.

Вернуться на верх