Django OneToMany - PullRequest
       17

Django OneToMany

7 голосов
/ 30 декабря 2010

Я реализую небольшое приложение интернет-магазина в django. Мой вопрос касается моделирования ордера с использованием множества линий заказов: Как смоделировать отношения Order to OrderLines с OrderLines, доступными непосредственно из Order, т.е.

Order
    def addOrderLine
    def allOrderLines

Я хочу получить доступ к OrderLines из Ордена и не должен получать их напрямую из БД. Django предлагает возможность определять ForeignKeys, но это не решает мою проблему, потому что мне нужно определить следующее:

class OrderLine(models.Model):
   order = models.ForeignKey(Order)

При таком определении я должен был бы получать строки заказа непосредственно из БД, а не через заказ.

Я мог бы использовать это определение и предоставить методы на уровне Order. Это, однако, не работает, потому что если я определю Order над OrderLine в файле models.py, Order не увидит OrderLines

Ответы [ 2 ]

8 голосов
/ 30 декабря 2010

Вы хотите от ForeignKey до Order от OrderLine.Примерно так:

from django.db import models

class Order(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)

class OrderLine(models.Model):
    order = models.ForeignKey(Order, related_name='orderlines')
    name = models.CharField(max_length=30)

    def __unicode__(self):
        return self.name

# Create a new order in the DB:
>>> order = Order.objects.create()
# Add a few items to this order:
>>> order.orderlines.create(name='Candied Yams')
<Candied Yams>
>>> order.orderlines.create(name='Minty loin of Lamb')
<Minty loin of Lamb>
# Get all items for this order:
>>> order.orderitems.all()
[<Candied Yams>, <Minty loin of Lamb>]

Это довольно хорошо задокументировано поведение:)

6 голосов
/ 30 декабря 2010

Если я правильно понимаю, вы ищете обратное ко многим к одному, то есть средство доступа, которое предоставляет вам набор всех orderlines за order.

К счастью,создание ссылки «многие к одному» сделает это за вас.Попробуйте это:

 o = Order.objects.get(id=X)
 lines = o.orderline_set.all()

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

  • Строчные буквы orderline являются преднамеренными, всегда строчными.
...