Как я могу упростить сложные отношения «многие ко многим» в моделях Django? - PullRequest
0 голосов
/ 17 января 2019

Я некоторое время искал, но, похоже, не могу найти существующий вопрос, который охватывает это, или мне не хватает терминологии, чтобы найти его.

Я пытаюсь зафиксировать отношенияаналогично следующему примеру продавцов фруктов в моделях Django.

  • Продавец А продает яблоки, груши и бананы в Лондоне, Берлине и Париже
  • Продавец Б продает яблоки, груши и бананы вЛондон, но только груши в Берлине и бананы в Париже
  • Продавец C продает только яблоки и бананы в Париже

То, что у меня на данный момент выглядит так:

class City(models.Model):
   name =  models.CharField(max_length=200)

class Region(models.Model):
   name =  models.CharField(max_length=200)
   cities = models.ManyToManyField(City)

class Fruit(models.Model):
   name =  models.CharField(max_length=200)

class Coverage(models.Model):
   name = models.CharField(max_length=200)
   regions = models.ManyToManyField(Region)
   fruits = models.ManyToManyField(Fruit)

class FruitSeller(models.Model):
   name = models.CharField(max_length=200)
   coverage = models.ManyToManyField(Coverage)

Это работает, но все поля ManyToMany заставляют его чувствовать себя излишне сложным и не очень элегантным.В конечном итоге мне нужно иметь возможность запрашивать такие вещи, как «Кто продает яблоки в Лондоне», «Где продаются бананы», «Какие фрукты продаёт продавец А».

Я также подумывал добавить еще одну модель «Рынок».какие внешние ключи к продавцу фруктов, региону и фрукту, которые позволили бы такие вещи, как Market.filter(Region__name='Western Europe', fruit__name='Apple').values('FruitSeller__name') Это кажется намного проще, но я думаю, что добавление новых продавцов фруктов через страницу администратора является немного утомительным упражнением, так как я считаю, что мне нужно было бы добавлять каждое отношение индивидуально,

Какой лучший подход к этому?

1 Ответ

0 голосов
/ 17 января 2019

Я считаю, что супер полезная вещь - это использование наборов внешних ключей с декоратором свойств. Это может хорошо сработать для вас. Например.

class City(models.Model):
   name =  models.CharField(max_length=200)

   # We add a property for the regions 
   @property
   def regions(self):
       # now we use the region set 
       return self.region_set.all()

class Region(models.Model):
   name =  models.CharField(max_length=200)
   city = models.ForeignKey(City)

Теперь вы можете получить доступ к городу региона через его внешний ключ, а вы можете получить доступ к регионам города через свойство регионов (city.regions)

...