Django模型中的关系问题

时间:2014-04-21 17:38:01

标签: python django django-models

我想知道我的模型关系是否正确。我正在创建一个发现平台,允许用户搜索各种产品。谢谢你的帮助!

我有四个models:Product,Boutique,ProductCategory&设计师

Every Product, has a Designer.

Every Product, has a ProductCategory.

Every Boutique, has a Product and the Product is related to a Designer

Every Designer, has a Product and the Product is related to a Boutique.

我的model.py代码:

设计

class Designer(models.Model):
    name = models.CharField(max_length=254, blank=True, null=True)
    label_name = models.CharField(max_length=254, blank=True, null=True)
    description = models.CharField(max_length=254, null=True, blank=True)
    specialites = models.CharField(max_length=254,  null=True, blank=True)
    image = models.ImageField(upload_to='images/designers/main',max_length=100, null=True) #For the argument upload_to, will add to the static folder and generated image will be stored in suing that path specified

    #For Admin Purposes, to track and see which if still active by for administrative users only
    is_active = models.BooleanField(default=True)

    #Foreign Keys & other relationships
    product = models.ManyToManyField(Product)
    boutiques = models.ManyToManyField(Boutique)

    #Metadata
    class Meta:
         verbose_name = _("Designer Information")

    #Helps return something meaningful, to show within the admin interface for easy interaction
    def __unicode__(self):
    return self.name

产品

class Product(models.Model):
    name = models.CharField(max_length=254, blank=True, null=True)
    description = models.CharField(max_length=254, blank=True, null=True)    
    color_name = models.CharField(max_length=254, null=True, blank=True)
    size_types = models.CharField(max_length=7, null=True, blank=True)
    product_price = models.DecimalField(max_digits=9,decimal_places=2)
    old_price = models.DecimalField(max_digits=9,decimal_places=2, blank=True,default=0.00) #To show original price if, new price has been added
    product_tags = models.CharField(max_length=254, null=True, blank=True, help_text='Comma-delimited set of SEO keywords for product tag area')
    novelty = models.CharField(max_length=254, null=True, blank=True)
    product_website = models.URLField(max_length=200,  null=True, blank=True) #To show other sites to Users, where they can purchase the particular product
    image = models.ImageField(upload_to='images/products/main',max_length=100, null=True) #For the argument upload_to, will add to the static folder and generated image will be stored in suing that path specified
    slug = models.SlugField(max_length=255, unique=True, help_text='Unique value for product page URL, created from name.')

    #This shows when each item was uploaded & by who, to the User 
    uploaded_by = models.CharField(max_length=254, blank=True, null=True)
    uploaded_at = models.DateTimeField(auto_now=True)

    #For Admin Purposes, to track and see which if still active by for administrative users only
    is_active = models.BooleanField(default=True)

    #Foreign Keys & other relationships
    categories = models.ManyToManyField(ProductCategory)
    boutiques = models.ManyToManyField(Boutique)
    designer = models.ForeignKey(Designer)

    #Metadata
    class Meta:
        verbose_name = _("Product")
        verbose_name_plural = _("Products")

    #Helps return something meaningful, to show within the admin interface for easy interaction
    def __unicode__(self):
        return self.name

产品分类

class ProductCategory(models.Model):
   name = models.CharField(max_length=255L, blank=True, null=True)
   slug = models.SlugField(max_length=50, unique=True, help_text='Unique value for product page URL, created from name.')

   #For Admin Purposes, to track and see which if still active by for administrative users only
   is_active = models.BooleanField(default=True)

   #For Admin Purposes, to track when we add each product and each product was updated by administrative users
   created_at = models.DateTimeField(auto_now_add=True)
   updated_at = models.DateTimeField(auto_now=True)

   #Helps return something meaningful, to show within the admin interface for easy interaction
   def __unicode__(self):
      return self.name

精品

class Boutique(models.Model):
        boutique_name = models.CharField(max_length=254, blank=True, null=True)
        address = models.CharField(max_length=255, blank=True, null=True)    
        city = models.CharField(max_length=50, null=True, blank=True)
        state = models.CharField(max_length=2, null=True, blank=True)
        zipcode = models.IntergerField(max_length=5, null=True, blank=True)
        boutique_website = models.URLField(max_length=200,  null=True, blank=True)

        #For Admin Purposes, to track a product to see which is active by administrative users
        is_active = models.BooleanField(default=True)

        #Foreign Keys & other relationships
        product = models.ManyToManyField(Product)
        designer = models.ManyToManyField(Designer)

       #Metadata
        class Meta:
            verbose_name = _("Boutique Information")

       #Helps return something meaningful, to show within the admin interface for easy interaction
        def __unicode__(self):
            return self.name

1 个答案:

答案 0 :(得分:2)

我怀疑你的models 是否正确

我认为这就是你要做的事情:

  1. Designer
  2. Designer可以包含多个Boutiques
  3. Boutique可以包含多个Products
  4. Product也与ProductCategory相关。
  5. 所以关系应该像Designer > Boutique > Product A Designer创建Boutique并在将其与a Products相关联后添加ProductCategory Designer

    这意味着:

    1. ForeignKey不应包含任何ForeignKey字段,而 应为Boutique Product }和Boutique模特。
    2. 模型ForeignKey应该DesignerProduct相关,ProductCategory相关。
    3. 模型ForeignKey不应包含ForeignKey字段。但 应该是ProductProduct
    4. 模型ForeignKey应与<{1}},DesignerBoutique有关的 ProductCategory
    5. 所以,通过这一切,你的模型看起来应该如下所示:

      class Designer(models.Model):
          name = models.CharField(max_length=100)
          # Other fields here ...
          # Don't create any ForeignKey fields
      
      
      class Boutique(models.Model):
          designer = models.ForeignKey(Designer)
          # Other fields here ...
          # No need for any more ForeignKeys
      
      
      class ProductCategory(models.model):
          name = models.CharField(max_length=100)
          # Other fields ...
          # This model doesn't need any ForeignKey field
      
      
      class Product(models.Model):
          designer = models.ForeignKey(Designer)
          boutique = models.ForeignKey(Boutique)
          category = models.ForeignKey(ProductCategory)
          name = models.CharField(max_length=100)
          # Other fields here ...
      

      这与Django docs中的 Poll 教程类似。在那里,您创建了一个民意调查,其中包含许多选项。因此,Choice模型具有ForeignKeyPoll模型,而不是反之亦然