2

У меня есть странная загадка, в которой мне нужна помощь в Django 1.8.4 с использованием python 3.4 в виртуальном env.Правильно использовать ссылки на внешние ключи в search_fields, администратор Django

У меня есть 2 модели в 2 разных приложениях ... как следует из нескольких ссылок на внешние ключи.

Инвентарь App

class InventoryItem(models.Model): 
    item_unique_code = models.CharField(max_length=256, blank=False, null=False) 
    category = models.CharField(max_length=256, blank=False, null=False,choices=[('RAW','Raw Material'),('FG','Finished Good'),('PKG','Packaging')]) 
    name = models.CharField(max_length=64, blank=False, null=False) 
    supplier = models.CharField(max_length=96, blank=False,null=False) 
    approved_by = models.CharField(max_length=64, editable=False) 
    date_approved = models.DateTimeField(auto_now_add=True, editable=False) 
    comments = models.TextField(blank=True, null=True) 

    def __str__(self): 
     return "%s | %s | %s" % (self.item_unique_code,self.name,self.supplier) 

    class Meta: 
     managed = True 
     unique_together = (('item_unique_code', 'category', 'name', 'supplier'),) 

Рецепт App

class RecipeControl(models.Model): 
    #recipe_name choice field needs to be a query set of all records containing "FG-Finished Goods" 
    recipe_name = models.ForeignKey(items.InventoryItem, related_name='recipe_name', limit_choices_to={'category': 'FG'}) 
    customer = models.ForeignKey(customers.CustomerProfile, related_name='customer') 
    ingredient = models.ForeignKey(items.InventoryItem, related_name='ingredient') 
    min_weight = models.DecimalField(max_digits=16, decimal_places=2, blank=True, null=True) 
    max_weight = models.DecimalField(max_digits=16, decimal_places=2, blank=True, null=True) 
    active_recipe = models.BooleanField(default=False) 
    active_by = models.CharField(max_length=64, editable=False) 
    revision = models.IntegerField(default=0) 
    last_updated = models.DateTimeField(auto_now_add=True, editable=False) 

    def __str__(self): 
     return "%s" % (self.recipe_name) 

    class Meta: 
     managed = True 
     unique_together = (('recipe_name', 'customer', 'ingredient'),) 

Я получаю некоторые странные результаты в классе Админ мой рецепт в ...

from django.contrib import admin 
from django.contrib.auth.models import User 
from .models import RecipeControl 
from Inventory import models 

class RecipeView(admin.ModelAdmin): 
    def save_model(self, request, obj, form, change): 
     obj.active_by = request.user.username 
     obj.save() 

    fieldsets = [ 
     ('Recipe Information',    {'fields': ['recipe_name', 'customer']}), 
     ('Ingredients', {'fields': ['ingredient','min_weight','max_weight','active_recipe']}), 
     ('Audit Trail', {'fields': ['active_by','revision','last_updated'],'classes':['collaspe']}), 
    ] 

    list_select_related = ['recipe_name','customer','ingredient'] 
    search_fields = ['recipe_name','customer','ingredient','active_by'] 
    readonly_fields = ('last_updated','active_by') 
    list_display = ['recipe_name','customer','ingredient','min_weight','max_weight','last_updated','active_by', 'active_recipe'] 

admin.site.register(RecipeControl, RecipeView) 

вопрос я пришел через это, если я пытаюсь сделать поиск по любому полю ForeignKey, Django бросает эту ошибку ...

Exception Type: TypeError at /admin/Recipe/recipecontrol/ 
Exception Value: Related Field got invalid lookup: icontains 

Согласно Django Admin Doc's и другим старым вопросам о StackOverflow по этому вопросу он говорит, что я должен делать что-то вдоль строки search_fields = ['inventoryitem__name'], но я думаю, что это относится к FK в том же приложении model.py. Есть ли более правильный способ ссылки/импорта других моделей из других приложений, которые мне не хватает, или мне нужно использовать какую-то магию методов вызываемого метода, чтобы заставить функцию поиска правильно искать? Я пробовал множество разных комбинаций, и ничего не работает. Я относительно новичок в Django, поэтому я уверен, что это что-то простое.

ответ

3

Вы должны использовать двойное обозначение подчеркивания для поиска поля на связанном объекте. Однако вы должны использовать имя поля внешнего ключа (например, recipe_name), а не имя модели (например, InventoryItem). Не имеет значения, находится ли модель внешнего ключа в одном приложении. Например:

search_fields = ['recipe_name__name'] 

Обратите внимание, что если вы хотите, чтобы искать recipe_name и ингредиентов поля, вам необходимо включить оба поля, несмотря на то, что они являются внешними ключами к одной и той же модели.

search_fields = ['recipe_name__name', 'ingredient__name'] 
+0

Большое спасибо за освобождение! Документы Django недостаточно для того, чтобы я мог получить сообщение. – Dan2theR