Отредактируйте уникальное поле, используемое как foreignkey в Django - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть две модели, одна Цена и Маркет :

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 методе, и я видел, что он эффективно обновляет уникальное поле, но. ..

1 Ответ

0 голосов
/ 29 апреля 2020

Может быть, вы можете переопределить метод сохранения, чтобы добиться этого:

class Market(...):

   def save(self, *args, **kwargs):
      prices = None
      if self.pk:
           obj = self.__class__.objects.get(pk=self.pk)
           if obj.market_name != self.market_name:
               prices = obj.price_set.all()
      super().save(*args, **kwargs)
      if prices is not None:
           prices.update(market_id=self.market_name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...