Django模型关系

时间:2016-06-23 23:47:19

标签: django django-models

我正在开发一个聚合器应用程序,我从不同的网站上获取产品。每个产品都有一个与其相关的子类别,颜色,图案。 (例如长袖蓝色横条纹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

2 个答案:

答案 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中,假设用户必须选择一种颜色,然后发生一些事情。希望这是你正在寻找的。