在Python 3.4.1上使用带有模型的Django 1.8:
class Product(models.Model):
name = models.CharField(max_length=255)
# some more fields here
def __str__(self):
return self.name
class PricedProduct(models.Model):
product = models.ForeignKey(Product, related_name='prices')
# some more fields here
def __str__(self):
return str(self.product)
class Coming(models.Model):
# some unimportant fields here
class ComingProducts(models.Model):
coming = models.ForeignKey(Coming)
priced_product = models.ForeignKey(PricedProduct)
# more unimportant fields
Run Code Online (Sandbox Code Playgroud)
和以下admin.py:
class ComingProductsInline(ForeignKeyCacheMixin, admin.TabularInline):
model = ComingProducts
class ComingAdmin(admin.ModelAdmin):
inlines = [ComingProductsInline]
Run Code Online (Sandbox Code Playgroud)
当然,我遇到了对数据库进行多次查询的问题:我对列表中的每个项目进行查询,并对每一行进行查询.所以,有100个项目,我得到100 ^ 2个查询.我已经用Django表单中的ModelChoiceField或ModelMultipleChoiceField的缓存查询集选项解决了每行查询的问题 但是我仍然遇到str方法的问题.我尝试过以下方法:
1)将prefetch_related添加到ComingAdmin:
def get_queryset(self, request):
return super(ComingAdmin, self).get_queryset(request). …Run Code Online (Sandbox Code Playgroud) 我的django管理员遇到了一些重大的性能问题.根据我有多少内联,有很多重复的查询.
models.py
class Setting(models.Model):
name = models.CharField(max_length=50, unique=True)
class Meta:
ordering = ('name',)
def __str__(self):
return self.name
class DisplayedGroup(models.Model):
name = models.CharField(max_length=30, unique=True)
position = models.PositiveSmallIntegerField(default=100)
class Meta:
ordering = ('priority',)
def __str__(self):
return self.name
class Machine(models.Model):
name = models.CharField(max_length=20, unique=True)
settings = models.ManyToManyField(
Setting, through='Arrangement', blank=True
)
class Meta:
ordering = ('name',)
def __str__(self):
return self.name
class Arrangement(models.Model):
machine = models.ForeignKey(Machine, on_delete=models.CASCADE)
setting = models.ForeignKey(Setting, on_delete=models.CASCADE)
displayed_group = models.ForeignKey(
DisplayedGroup, on_delete=models.PROTECT,
default=1)
priority = models.PositiveSmallIntegerField(
default=100,
help_text='Smallest number will …Run Code Online (Sandbox Code Playgroud)