我正在开发一个聚合器应用程序,我从不同的网站上获取产品。每个产品都有一个与其相关的子类别,颜色,图案。 (例如长袖蓝色横条纹T恤。)这里的子类别是长袖T恤和蓝色和图案条纹。我已经创建了这样的模型
from __future__ import unicode_literals
from django.db import models
from smart_selects.db_fields import ChainedForeignKey,ChainedManyToManyField
# Create your models here.
class Category(models.Model):
title=models.CharField(max_length=255)
def __str__(self):
return self.title
class Product(models.Model):
title=models.CharField(max_length=255)
price=models.DecimalField(max_digits=10,decimal_places=4,null=True)
subcategory = models.ForeignKey('Subcategory',related_name='products',null=True,blank=True)
color = models.ForeignKey('Color',related_name='productcolor',null=True)
pattern = models.ForeignKey('Pattern',related_name='productpattern',null=True)
image= models.URLField(null=True,blank=True)
# outfit= models.ForeignKey('Outfit',related_name='looks',null=True)
def __str__(self):
return self.title
class Subcategory(models.Model):
title=models.CharField(max_length=255)
category = models.ForeignKey('Category',related_name='category',blank=True,null=True)
# product= models.ForeignKey('Product',related_name='Productinsub',null=True)
# outfit= models.ForeignKey('Outfit',related_name='outlook',null=True)
class Meta:
verbose_name_plural = "subcatagories"
def __str__(self):
return self.title
class Color(models.Model):
title=models.CharField(max_length=255)
subcategory = models.ManyToManyField('Subcategory',related_name='subcategory',null=True)
# pattern = models.ForeignKey('Pattern', blank=True, null=True, related_name='colors')
def __str__(self):
return self.title
class Pattern(models.Model):
title=models.CharField(max_length=255)
# color = models.ManyToManyField('Color',related_name='patterns',null=True)
#
def __str__(self):
return self.title
直到这一切都很好,问题出在前端边栏我需要在下面显示颜色和图案下方的子类别。现在,当用户从侧边栏选择子类别(例如长袖T恤)时,在颜色侧边栏中应该看到该特定子类别的所有可用颜色,并且模式也是如此。那么如何从子类别中获取所有颜色,因为颜色与子类别之间没有直接的关系?
EDIT 我已经添加了我的完整模型,我已经添加了关系,但是当我上传我的csv时,它不是映射多个到多个字段,这是我如何从django -import export映射我的csv
class CategoryAdmin(admin.ModelAdmin):
pass
admin.site.register(Category,CategoryAdmin)
# class LookAdmin(admin.ModelAdmin):
# pass
#
#
# admin.site.register(Look,LookAdmin)
@admin.register(models.Subcategory)
class SubcategoryAdmin(bulk_admin.BulkModelAdmin):
search_fields = ('title',)
raw_id_fields = ('category',)
# admin.site.register(Subcategory,SubcategoryAdmin)
class ColorAdmin(admin.ModelAdmin):
pass
admin.site.register(Color,ColorAdmin)
class ProductWidget(widgets.ForeignKeyWidget):
def clean(self, value):
return self.model.objects.get_or_create(title= value)[0]
class ProductResource(resources.ModelResource):
category = fields.Field(column_name='category', attribute='category', widget=ProductWidget(Category, 'title'))
subcategory = fields.Field(column_name='subcategory', attribute='subcategory', widget=ProductWidget(Subcategory, 'title'))
color = fields.Field(column_name='color', attribute='color', widget=ProductWidget(Color, 'title'))
pattern = fields.Field(column_name='pattern', attribute='pattern', widget=ProductWidget(Pattern, 'title'))
class Meta:
model = Product
class ProductAdmin(ImportExportModelAdmin,bulk_admin.BulkModelAdmin):
resource_class = ProductResource
list_filter = ('subcategory', admin.RelatedOnlyFieldListFilter),('color', admin.RelatedOnlyFieldListFilter),('pattern', admin.RelatedOnlyFieldListFilter)
list_select_related = ('subcategory','color','pattern')
# raw_id_fields = ('outfit',)
# bulk_inline = (ProductInline,)
# inlines = (OutfitInline,)
admin.site.register(Product,ProductAdmin)
我的csv文件看起来像这样
title price category subcategory color id
Stripe Top 899 Top Dress red
Fringe Shoulder Midi Dress 3495 Top Dress red
Button Through Skater Dress 1595 Top Dress red
答案 0 :(得分:0)
要从子类别访问颜色模型,我将使用您已定义的related_name。
list_of_colors = []
for product in subcategory.products.all():
list_of_colors.append(product.color)
#And for avoiding repeated colors
list_of_colors = set(list_of_colors)
list_of_colors = list(list_of_colors)
return list_of_colors
不确定你是否可以这样做
#And for avoiding repeated colors
return list(set(list_of_colors))
我希望我能正确理解这个问题。我不知道这是否是最佳方式...但我希望它有所帮助。
答案 1 :(得分:0)
在下文中,我将假设您将子类别.id传递给您的视图,因为您说用户选择了子类别。
views.py:
def YourView(request, subcategory_id)
subcategory = Subcategory.objects.get(id=subcategory_id)
products = subcategory.products_set.all()
context = {'products': products}
template = 'YourTemplate.html'
return render(request, context, template)
html:
<div class="btn-group">
<button class="btn btn-primary dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Colors
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenu1">
<ul class="list-group">
{% for c in products %}
<button class="list-group-item" type="submit" value="{{ c.color }}" name="some_name">{{ c.color }}</button>
{% endfor %}
</ul>
</div>
</div>
我已将颜色放在按钮dropdownMenu中,假设用户必须选择一种颜色,然后发生一些事情。希望这是你正在寻找的。