У меня есть две модели, которые ссылаются друг на друга.Вот модель.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
Тем не менее, это не мешает сохранять слишком много предметов в рюкзаке или фактически отображать эту сохраненную информацию в другом объекте.
Я не уверен, должен ли этот код быть на самом деле в формах или сериализаторах (видел оба подхода).).Какая лучшая практика?