改变外键对象的字段

时间:2010-03-24 13:34:32

标签: django

我有以下问题。

我有一个模型Towar

class Towar(models.Model):
  nrSeryjny = models.CharField(max_length=100)
  opis = models.CharField(max_length=255)
  naStanie = models.NullBooleanField(null=True)

  def __unicode__(self):
      return "%s" % self.opis

  def lowerName(self):
      return self.__class__.__name__.lower()

  def checkState(self):
      return self.naStanie

  def changeState(self,state):
      self.naStanie=state

  class Meta:
      ordering=['nrSeryjny']
      app_label = 'baza'
      permissions=(("view_towar","mozna miec podglad dla towar"),)

和另一个模型Wypozyczenie,它通过外键关系链接到Towar

class Wypozyczenie(models.Model):
    dataPobrania = models.DateField()
    pracownik = models.ForeignKey(User,null=True)
    kontrahent = models.ForeignKey(Kontrahenci,null=True)
    towar = models.ForeignKey(Towar,null=True)
    objects = WypozyczenieManager()
    default_objects = models.Manager()

    ZwrotyObjects = WypozyczenieZwrotyManager()

    def lowerName(self):
        return self.__class__.__name__.lower()

    def __unicode__(self):
        if self.towar == None:
            return "Dla:%s -- Kto:%s -- Kiedy:%s -- Co:%s" % (self.kontrahent,self.pracownik,self.dataPobrania,"Brak")
        else:
            return "Dla:%s -- Kto:%s -- Kiedy:%s -- Co:%s" % (self.kontrahent,self.pracownik,self.dataPobrania,self.towar)

    class Meta:
        ordering = ['dataPobrania']
        app_label = 'baza'
        permissions = (("view_wypozyczenie","mozna miec podglad dla wypozyczenie"),)

以及添加模型的视图:

def modelAdd(request,model,modelForm):
    mod = model()
    if request.user.has_perm('baza.add_%s' % mod.lowerName()):
        if request.method == 'POST':
            form=modelForm(request.POST)
            if form.is_valid():
                form.save()
                return HttpResponseRedirect('/'+ mod.lowerName() + '/')
        else:
            form = modelForm()
            v = RequestContext(request,{'form':form})
            return render_to_response('add_form.html',v)

我想要的是,当我添加Wypozyczenie并保存它时,Towar存储的Wypozyczenie会将其naStanie字段从True更改为False。

迎接

3 个答案:

答案 0 :(得分:0)

你有什么尝试?

你不能只是把

myinstance = form.save()
towar = myinstance.towar
towar.naStanie = False
toware.save()

而不是您在视图中对form.save()的简单调用。

答案 1 :(得分:0)

如果你想始终保持这两者同步,你可以覆盖Wypozyczenie的save()方法。

class Wypozyczenie(models.Model):
    ...

    def save(self):
        self.towar.naStanie = False
        self.towar.save()

或者,您也可以覆盖ModelForm的save()方法。

答案 2 :(得分:0)

您可以使用保存 Wypozyczenie 对象时发出的信号。它可能比覆盖save()更“干净”,特别是当它为其他模型重用该函数时很有用:

@receiver(models.signals.post_save, sender=Wypozyczenie)
def after_wypozyczenie_save(sender, instance, created, **kwargs):
    # `instance` is your saved Wypozyczenie object, you can
    # access all it's fields here:
    instance.towar.naStanie = False
    instance.towar.save()

    # It's also possible to do different action on the first save
    # and on subsequent updates:
    #
    # if created:
    #     ...
    # else:
    #     ...

在保存或删除之前发送了other signalsDjango documentation on signals在这里非常有帮助。