Выбор отдельного вложенного отношения в Django - PullRequest
0 голосов
/ 17 августа 2011

Для быстрого описания системы у меня есть список заказов.Каждый ордер может иметь от 1 до n пунктов, связанных с ним.Каждый предмет имеет список размеров предметов.Учитывая следующие модели, которые были сокращены в терминах полей для этого вопроса, моя цель состоит в том, чтобы получить отдельный список объектов ItemSize для данного объекта Order.

class ItemSize(models.Model):
    name = models.CharField(max_length=10, choices=SIZE_CHOICES)

class Item(models.Model):
    name = models.CharField(max_length=100)
    sizes = models.ManyToManyField(ItemSize)

class OrderItem(models.Model):
    order = models.ForeignKey(Order)
    item = models.ForeignKey(Item)

class Order(models.Model):
    some_field = models.CharField(max_length=100, unique=True)  

Итак ... если у меня есть:

o = Order.objects.get(id=1)
#how do I use the ORM to do this complex query? 
#i need o.orderitem_set.items.sizes (pseudo-code)

Ответы [ 2 ]

3 голосов
/ 17 августа 2011

В вашей текущей настройке ответ @radious правильный.Однако OrderItems действительно не должно существовать.Заказы должны иметь прямые отношения M2M с Предметами.Промежуточная таблица будет создаваться во многом как OrderItems для достижения отношений, но с M2M вы получите гораздо более простые и логичные отношения

class Order(models.Model):
    some_field = models.CharField(max_length=100, unique=True)
    items = models.ManyToManyField(Items, related_name='orders')

Затем вы можете сделать: Order.items.all() и Item.orders.all().Запрос, необходимый для этой проблемы, будет упрощен до:

ItemSize.objects.filter(item__orders=some_order)

Если вам нужны дополнительные данные о взаимосвязи Order-Item, вы можете сохранить OrderItem, но использовать его в качестве сквозной таблицы, например:

class Order(models.Model):
    some_field = models.CharField(max_length=100, unique=True)
    items = models.ManyToManyField(Items, related_name='orders', through=OrderItem)

И вы по-прежнему получаете более простые отношения.

0 голосов
/ 17 августа 2011
ItemSize.objects.filter(items__orderitems__order=some_order)

При условии, что у вас есть обратные ключи, такие как:

  • ItemSize.items - обратный fk для всех элементов с таким размером
  • Item.orderitems - в обратном порядке для всех элементов заказа, связанных с элементом
  • Item.orders - вы можете догадаться;)

(AFAIR, что имена будут выбраны по умолчанию, но я не уверен, вы должны это проверить)

Дополнительные сведения о запросах обратного ключа доступны в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...