2016-06-23 194 views
-1

我正在从不同网站获取产品的聚合器应用程序。每种产品都有一个与其相关的子类别,颜色和图案。 (例如长袖蓝色横条纹T恤。)这里的子类别是长袖T恤和颜色蓝色和图案条纹。我创建的模型这样Django模型关系

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恤)时,在侧边栏中应该可以看到该特定子类别的所有可用颜色,并且同样适用于图案。那么如何从子类别中获取所有颜色,因为颜色与子类别没有直接关系?

编辑 我已经加了我完整的模型的建议我已经添加了关系,但是当我上传我的CSV它不映射多对多领域这里是如何将我的CSV从-import出口

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) 
Django的地图

我的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

@JoseRomeroi已添加模型 –

回答

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

我希望我理解正确的问题。我不知道这是否是最好的办法...但我希望它有帮助。

+0

您是否尝试设置该子类别为'products = subcategory.products_set'的所有产品,然后从这些产品中获取颜色? – user2466766

+0

@ user2466766能不能详细说一下我在django还是个很初学的人 –

0

在下面我会假设你传递subcategory.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中,假设用户将不得不选择一种颜色然后发生某种事情。希望这是你正在寻找的。