如何在 Django 上添加与多对多内联管理相关的其他字段

问题描述 投票:0回答:1

我有事务模型和匹配模型,它们具有多对多的字段关系

class Transaction(models.Model):
    amount = models.DecimalField(max_digits=16, decimal_places=2)
    card_no = CleanTextField(null=True, blank=True)
    date = models.DateField()

class Match(models.Model):
    match_at = models.DateTimeField(auto_now_add=True)
    a_transactions = models.ManyToManyField(Transaction, related_name="a_matches")
    b_transactions = models.ManyToManyField(Transaction, related_name="b_matches")

还有内联管理和模型管理

class ATransactionInline(admin.TabularInline):
    model = Transaction.a_matches.through
    extra = 0 

class BTransactionInline(admin.TabularInline):
    model = Transaction.b_matches.through
    extra = 0 


class TransactionAdmin(admin.ModelAdmin): 
    list_display = ["amount", "date"]
    inlines = [ATransactionInline, BTransactionInline]


admin.site.register(Transaction, TransactionAdmin)

因此,在交易管理页面中,会在内联中显示匹配对象 但我需要显示与该匹配对象相关的 a 和 b 事务 有什么解决办法吗?

python-3.x django django-admin
1个回答
0
投票

如果我正确理解你的问题,你可以覆盖每个内联中的

get_queryset
,并过滤你想要的内容:

class ATransactionInline(admin.TabularInline):
    model = Transaction.a_matches.through
    extra = 0
    verbose_name = "A Transaction"
    verbose_name_plural = "A Transactions"

    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        return queryset.filter(transaction__in=self.parent_obj.a_matches.all())

class BTransactionInline(admin.TabularInline):
    model = Transaction.b_matches.through
    extra = 0
    verbose_name = "B Transaction"
    verbose_name_plural = "B Transactions"

    def get_queryset(self, request):
        queryset = super().get_queryset(request)
        return queryset.filter(transaction__in=self.parent_obj.b_matches.all())

class TransactionAdmin(admin.ModelAdmin):
    list_display = ["amount", "date"]
    inlines = [ATransactionInline, BTransactionInline]

admin.site.register(Transaction, TransactionAdmin)

© www.soinside.com 2019 - 2024. All rights reserved.