Джанго: поле ManyToMany на модели - PullRequest
0 голосов
/ 28 августа 2018

У меня есть эти модели:

class Unit(AppModel):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

class Item(AppModel):
    title = models.CharField(max_length=255)
    units = models.ManyToManyField("Unit", symmetrical=False, related_name="items")

    def __str__(self):
        return self.title + self.units

class Invoice(AppModel):
    items = models.ManyToManyField("Item", symmetrical=False, related_name="invoices")

    def __str__(self):
        return "invoice_" + self.id

Как видите, у нас есть Item с несколькими units и Invoice с несколькими items.

Но я хочу, чтобы каждый item в Invoice имел только один unit. Как этого добиться?

т.е. some_item.units должен возвращать все свои типы единиц измерения. Принимая во внимание, что for item in some_invoice.items: return item.units должен вернуть единицу.

Есть ли другой способ реализовать это? Новый дизайн базы данных ?? Тогда как? Помогите ..

Примечание : я не смог создать заголовок этого сообщения. Не стесняйтесь делать это. Спасибо.

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Вы можете изменить отношение элемента к ForeignKey

class Item(AppModel):
    title = models.CharField(max_length=255)
    units = models.ForeignKey(Unit, related_name="items")

Обновление

Установите модель счета-фактуры между Единицей и Предметом.

class Item(AppModel):
    units = models.ManyToManyField(Unit, through='Invoice')

class Unit(AppModel):
    ...

class Invoice(AppModel):
    item = models.ForeignKey(Item, related_name='invoice')
    unit = models.ForeignKey(Unit, related_name='invoice')
0 голосов
/ 29 августа 2018

Это то, что тебе нужно, я думаю.

class Unit(AppModel):
   name = models.CharField(max_length=255)

   def __str__(self):
      return self.name

class Item(AppModel):
    title = models.CharField(max_length=255)
    units = models.ManyToManyField("Unit", symmetrical=False, 
            related_name="items", through='ItemUnit')

    def __str__(self):
       return self.title + self.units

class ItemUnit(AppModel):
   item = models.ForeignKey(Item)
   unit = models.ForeignKey(Unit)

   def __str__(self):
     return "%s --- %s " % (self.item, self.unit)

class Invoice(AppModel):
    item_unit = models.ForeignKey(ItemUnit, blank=True, null=True, 
    related_name='invoices', on_delete=models.SET_NULL)

В приведенной выше настройке Item-Unit-Invoice всегда является уникальной комбинацией. Убедитесь, что вы указали on_delete для FK «многие ко многим».

0 голосов
/ 28 августа 2018

Вам нужен ForeignKey to Unit для вашей модели Item, а не ManyToManyField. Таким образом, у предмета будет только один юнит, но у юнита будет разрешено иметь несколько предметов.

...