7

仮想環境でpython 3.4を使用して、Django 1.8.4で助けが必要な奇妙な難問があります。

2 つの異なるアプリに 2 つのモデルがあります...次のように、複数の外部キー参照があります。

在庫アプリ

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'),)

レシピアプリ

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'),)

Recipe の Admin クラスで奇妙な結果が得られています...

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']の行に沿って何かを行う必要があると言われていますが、これは同じアプリ model.py の FK を参照していると思います。不足している他のアプリから他のモデルを参照/インポートするより正しい方法はありますか、または検索機能を正しく検索するには、ある種の呼び出し可能なメソッドマジックを使用する必要がありますか? さまざまな組み合わせを試しましたが、何もうまくいかないようです。私はDjangoに比較的慣れていないので、それは単純なものだと確信しています。

4

1 に答える 1

9

関連オブジェクトのフィールドを検索するには、二重下線表記を使用する必要があります。recipe_nameただし、モデルの名前(例: ) ではなく、外部キー フィールドの名前 (例: ) を使用する必要がありますInventoryItem。外部キーのモデルが同じアプリ内にあるかどうかは関係ありません。例えば:

search_fields = ['recipe_name__name']

レシピ名フィールドと原料フィールドを検索する場合は、同じモデルへの外部キーであっても、両方のフィールドを含める必要があることに注意してください。

search_fields = ['recipe_name__name', 'ingredient__name']
于 2016-02-01T12:00:35.500 に答える