1

(管理者から) トランザクションを保存したらすぐに、トランザクションに関与している人々 (債権者と債務者) の残高の値を更新したいと思います。ここに私のモデルがあります:

#models.py
class Person(models.Model):
    first_name = models.CharField(max_length = 30) 
    last_name = models.CharField(max_length = 30) 
    phone_number = models.CharField(max_length = 30) 
    email = models.EmailField('e-mail')
    balance = models.DecimalField(max_digits = 5, decimal_places = 2)

class Transaction(models.Model):
    creditor = models.ForeignKey(Person,related_name = 'creditor')
    debtors = models.ManyToManyField(Person, related_name = 'debtors')
    value = models.DecimalField(max_digits = 5, decimal_places = 2)
    split = models.BooleanField()
    date = models.DateField()

これが私が考えたことですが、トランザクションが変更されている場合にのみ機能します(初めて保存する場合は機能しません):

#admin.py
class PersonAdmin(admin.ModelAdmin):
    list_display = ('first_name','last_name','balance')

class TransactionAdmin(admin.ModelAdmin):
    list_display = ('creditor','value','date')
    list_filter = ('date',)
    date_hierarchy = 'date'
    ordering = ('-date',)
    filter_horizontal = ('debtors',)

    def save_model(self,request,obj,form,change):
            obj.save()
            if obj.split:
                    split_value = obj.value/(obj.debtors.all().count()+1)
                    for debtor in obj.debtors.all():
                            p = Person.objects.get(id = debtor.id)
                            p.balance = p.balance - split_value
                            p.save()
                    p = Person.objects.get(id = obj.creditor.id)
                    p.balance = p.balance + (obj.debtors.all().count())*split_value                     
                    p.save()

admin.site.register(Person,PersonAdmin)
admin.site.register(Transaction,TransactionAdmin)

私はDjangoが初めてで、これを行う適切な方法について本当に混乱しています。これについて何か助けていただければ幸いです。

4

2 に答える 2

0

djangoのシグナルを使用できるので、保存が実行されると(同期的に)起動される関数を作成します(post-save正確には関数)。

たとえば、次のようになります。

from django.db.models.signals import post_save
from signals import do_something

class TransactionAdmin(models.Model):
    ...

post_save.connect(do_something, sender=TransactionAdmin)

およびsignals.pyファイル内:

def do_something(sender, instance, created, *args, **kwargs):
    if created and sender == TransactionAdmin:
        ...
    ...
于 2012-10-16T14:26:28.950 に答える
0

これらのリンクを調べた後に見つけた解決策は次のとおりです。

  1. https://docs.djangoproject.com/en/dev/ref/contrib/admin/
  2. http://reinout.vanrees.org/weblog/2011/11/29/many-to-many-field-save-method.html
  3. ManyToMany リレーションシップが保存後すぐに更新されない問題
  4. Django manytomany シグナル?
  5. http://python.6.n6.nabble.com/Process-Related-Object-when-Saving-td4974737.html

   def save_related(self,request,form,formsets,change):
            form.save_m2m()

            debtors = form.instance.debtors.all()
            n_debtors = debtors.count()
            creditor = form.instance.creditor
            value = form.instance.value

            if form.instance.split:
                    value = value/(n_debtors + 1)

            for debtor in debtors:
                    p = Person.objects.get(id = debtor.id)
                    p.balance = p.balance - value
                    p.save()

            p = Person.objects.get(id = creditor.id)    
            p.balance = p.balance + n_debtors*value
            p.save()
于 2012-10-16T23:36:40.970 に答える