У меня есть две модели, одна Цена и Маркет :
class Market(models.Model):
market_name = models.CharField(max_length=3, unique=True)
class Price(models.Model):
market = models.ForeignKey(Market, on_delete=models.CASCADE, to_field="market_name")
Я хочу иметь возможность редактировать поле market_name на модели Market и последующие объекты Price обновляются без ошибок.
update or delete on table "appname_market" violates foreign key constraint "appname_price_market_id_5f75a816_fk_appnames" on table "appname_price"
DETAIL: Key (market_name)=(Cute Martket Name) is still referenced from table "appname_price".
Указание их на pk является одним из решение, но я хочу придерживаться использования market_name в качестве иностранного ключа по причине. Как бы вы это сделали?
Я представил метод для pre_save :
@receiver(pre_save, sender=Market)
def update_market_field(sender, instance, *args, **kwargs):
try:
obj = sender.objects.get(pk=instance.pk)
except sender.DoesNotExist:
pass # Object is new, so field hasn't technically changed, \
# but you may want to do something else here.
else:
if not obj.market_name == instance.market_name: # Field has changed
Price.objects.filter(market=obj.market_name).update_or_create(market=instance)
Но это все равно вызывает ошибки, потому что на самом деле объект Market еще не был сохранен. Половина решения также состоит в том, чтобы удалить все Цены с этим obj.martket_name в этом pre_save методе, и я видел, что он эффективно обновляет уникальное поле, но. ..