У меня есть 2 модели django - основная (продукт) и связанные детали (PhysicalProperty - это ссылка «многие ко многим» через дополнительную модель ProductMetricals).
В основной модели Product я написал приемник post_save, в котором детально проверяю и очищаю данные.
Если я попробую
Product.save()
от IDLE работает нормально.
Но если я изменю и сохраню основной продукт в форме администратора, у меня будет исключение.
Select a valid choice. That choice is not one of the available choices
Я пытался отладить это, но стали понятия не имею - почему администратор вызывает исключение?
Вот код
models.py
from django.db import models
# Create your models here.
class PhysicalProperty(models.Model):
shortname = models.CharField(max_length=255)
def __str__(self):
return self.shortname
class Product(models.Model):
shortname = models.CharField(max_length=255)
product_metricals = models.ManyToManyField( PhysicalProperty, through = 'ProductMetricals' )
def __str__(self):
return self.shortname
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=Product)
def product_post_save(sender, instance, **kwargs):
ProductMetricals.objects.filter( product = instance ).delete()
class ProductMetricals(models.Model):
amount=models.FloatField()
product=models.ForeignKey( Product )
physicalproperty = models.ForeignKey(PhysicalProperty )
class Meta:
unique_together = ("product", "physicalproperty")
admin.py
from django.contrib import admin
# Register your models here.
from product.models import Product, ProductMetricals, PhysicalProperty
from django import forms
class PhysicalPropertyAdmin(admin.ModelAdmin):
list_display = ['shortname']
admin.site.register(PhysicalProperty, PhysicalPropertyAdmin)
class ProductMetricalsInline(admin.TabularInline):
model = ProductMetricals
fieldsets = [
(None, {'fields': ['physicalproperty','amount']}),
]
extra = 2
class ProductAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['shortname']}),
]
inlines = [ProductMetricalsInline]
list_display = ['shortname']
admin.site.register(Product, ProductAdmin)
Если я создаю какое-то свойство, создаю продукт, добавляю одно свойство к продукту, затем изменяю имя продукта и сохраняю его - я получил исключение
Исключение исходит (я думаю) из ProductMetricals.objects.filter (product = instance) .delete ()