Перекрестные ссылки на многие поля, не сохраняющие изменения Django RF - PullRequest
0 голосов
/ 23 июня 2019

У меня есть две модели, которые ссылаются друг на друга.Вот модель.py:

class Backpack(models.Model):
    capacity = models.PositiveSmallIntegerField(default=0),
    list_of_items =  = models.ManyToManyField('Items', related_name='items', blank=True)

class Item(models.Model):
    name = models.CharField(_('name'), max_length=250)
    list_of_backpacks = models.ManyToManyField('Backpack', related_name='backpack', blank=True)

Я бы обычно использовал третью модель для хранения такого рода отношений (IntemsInBackpack; я предполагаю, что это будет 3NF), однако я получил оба поля m2m в спецификации.Является ли правильный подход подходящим для множества полей?Или я должен сделать это по-другому?

Я могу сериализовать модели и использовать формы для очистки пользовательского ввода (я их пропустил, так как они работают).Изначально я пытался ограничить число Items в функции Backpack in clean().Он работает в соответствующих формах, например, BackpackForm, правильно возвращает ValidationError, но изменения локальны в том смысле, что они отображаются только в объекте Backpack и не отражаются в Item (list_of_backpacks остается без изменений).

нашел несколько решений для ссылок на один объект m2m (с определенными функциями create и update для DRF), но я запутался и не могу правильно применить этот подход.

Моя реализация:

class ItemForm(forms.ModelForm):
    def save(self, commit=True):
        item = super(ItemForm, self).save(commit=False)

        backpacks = self.cleaned_data.get('list_of_backpacks')
        for backpack in backpacks:
            if backpack.capacity > item.list_of_backpacks.count():
                raise ValidationError('Maximum ' + str(backpack.capacity) + ' items allowed in the backpack!')
            self.save_m2m()
            if commit:
                item.save()
        return item

Тем не менее, это не мешает сохранять слишком много предметов в рюкзаке или фактически отображать эту сохраненную информацию в другом объекте.

Я не уверен, должен ли этот код быть на самом деле в формах или сериализаторах (видел оба подхода).).Какая лучшая практика?

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