2015-08-07 2 views
0

У меня есть быстрый вопрос о дизайне базы данных, и мне бы очень понравилась ваша помощь!Django Database: дизайн модели, объединяющей две модели

Ситуация такова. У меня есть две модели, одна для заказов и один для списка шагов, которые этот приказ проходит через:

  • Модель: Заказы
    • Область: Order_ID
  • Модель: Шаги
    • поле: Step_ID
    • поле: STEP_NAME

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

ID заказа | Шаг (id = 1) | Шаг (id = 2) | Шаг (ID = 3), и т.д.

Так что для каждого заказа, который добавляется, шаг может быть помечен как, например, [завершен, задерживается, пропущен]:

20150401 | Завершено | Отложенные | Завершено

Но я не могу понять, какие настройки в Django мне нужно сделать. Я просмотрел поля «многие-ко-многим», но мне нужен толчок в правильном направлении.

ответ

2

Что именно вы ищете, так это иметь дополнительные поля для шагов, основанных на заказе, используя его.

Если я правильно понял ваши вопросы, это называется Extra fields on many-to-many relationships Мы можем определить Order может иметь многие Step и Step может иметь много Order так это ManytoMany отношения. Однако вам нужны дополнительные данные для этих отношений, и поэтому вам нужно использовать ключевое слово through в отношениях, чтобы связать экземпляр с этими отношениями.

class Order(models.Model): 
    order_id = models.IntegerField(...) 


class Step(models.Model): 
    name = models.CharField(max_length=128) 
    orders = models.ManyToManyField(Order, through='StepOrder') 


class StepOrder(models.Model): 
    order = models.ForeignKey(Order) 
    step = models.ForeignKey(Step) 

    ## date of the order starting this step 
    date_created = models.DateField(...) 
    date_end = models.DateField(...) 

    status = models.CharField(max_length=128, default="Pending") 
+0

Большое спасибо! Очень помог! –

1

Вы можете создать новую модель под названием OrderStep, которая объединяет эти два.

class Order(models.Model): 
    ... 


class Step(models.Model): 
    step_name = models.CharField(max_length=50) 
    orders = models.ManyToManyField(Order, through='OrderStep') 


class OrderStep(models.Model): 
    order = models.ForeignKey(Order) 
    step = models.ForeignKey(Step) 
    status = models.CharField(max_length=50) 
+0

Отредактировано с учетом ответа Отмана – Alistair

+0

Спасибо, Алистер! Извините, я сделал ответ Отмана принятым, потому что я должен был выбрать кого-то! Я очень ценю вашу помощь! –

+0

Без проблем Робин! – Alistair

Смежные вопросы