Django Python中的搜索字段

7 投票
3 回答
11928 浏览
提问于 2025-04-15 18:17

我在想,怎么能用外键来进行搜索,比如说

class Product(models.Model):
    name = models.CharField(max_length = 127)
    description = models.TextField()
    code = models.CharField(max_length = 127)

    def __unicode__(self):
        return self.name + " - " + self.code

class ProductLot(models.Model):
    product = models.ForeignKey(Product)
    code = models.CharField(max_length = 30)
    lot_no = models.CharField(max_length = 30)
    location = models.CharField(max_length = 127)
    incoming = models.IntegerField()
    commited = models.IntegerField()
    available = models.IntegerField()
    reorder = models.IntegerField()
    created_date = models.DateField(auto_now_add=True)

    def __unicode__(self):
        return self.code + " - " + self.product.name + " - " + self.lot_no

class LotComment(models.Model):
     product_lot = models.ForeignKey(ProductLot)
     comment_user = models.ForeignKey(User, null=True)
     comment_text = models.TextField()
     created_date = models.DateField(auto_now_add=True)

    def __unicode__(self):
        return self.product_lot.product.code + " - " + 
           self.product_lot.product.name + " - " + 
           self.product_lot.lot_no + " - " + str(self.created_date)

然后在我的 admin.py 文件里,我有

from CMS.Inventory.models import Product

class padmin(admin.ModelAdmin):
    search_fields=['name', 'description', 'code', 'lot_no' ]
admin.site.register(Product, padmin)

但是我希望 'LotComments' 也能使用和 'Product' 一样的搜索字段,比如代码等等。

希望我解释得清楚。

3 个回答

1

在引用外键的时候,使用两个下划线__

from CMS.Inventory.models import Product

class ProductAdmin(admin.ModelAdmin):
    search_fields=['name__name', 'description', 'code', 'lot_no' ]
    admin.site.register(Product, padmin)
2

接着之前的回答,我想推荐一个叫做 Django Admin 高级过滤器 的插件。

这个插件可以帮助你添加高级搜索功能,并且支持保存高级搜索的设置。在你的情况下,外键字段也可以映射到一个名称上。

class padmin(AdminAdvancedFiltersMixin, admin.ModelAdmin):
    advanced_filter_fields = ('name', ('product_lot__product__name', 'Product name'))
17

你可以在管理后台的 search_fields 中指定相关字段的搜索,和在Django的查询集中做法是一样的。具体可以查看文档。对于 LotComments 这个对象,search_fields 的设置大概是这样的:

search_fields = ['product_lot__product__name', 
                 'product_lot__product__description', 
                 'product_lot__product__code',
                 'product_lot__lot_no']

撰写回答