Search_fields in django python

2019-04-26 17:57发布

问题:

I was wondering how I am able to use a foreign key to preform a search for example

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)

than in my admin.py file I have

from CMS.Inventory.models import Product

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

but I want for 'LotComments' to be able to use the same search fields that 'Product' can as for code ect.

Hope I explained this well

回答1:

You can specify related field searches in the admin search_fields the same way you do on Django querysets. Check on the documentation. For the LotComments object, the search_fields would look something like:

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


回答2:

Adding to the previous answers. I would like to suggest Django Admin advance filters

User this plugin to add advance search and save advance search support. Also in your case foreign key fields can be mapped to a name.

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


回答3:

For referencing the foreign key use __ (two underscores):

from CMS.Inventory.models import Product

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