【发布时间】:2014-06-10 13:31:46
【问题描述】:
建立一个专门销售衬衫、书籍和专辑的电子商务网站,以了解不同的款式。让我失望的两件事是:
1.) 我不确定我是否在我的模型中创建了过多的冗余,如果是的话,我该如何最小化它。例如,对于音乐专辑,我正在为专辑、艺术家和曲目创建一个模型,并且在每个模型中我多次引用其他模型。
2.) 关于我的 ManyToManyFields,通过引用一个直到在 models.py 中进一步向下定义的模型,python manage.py syncdb 会抛出一个我没有定义关系的错误。在这个 SO 问题中进一步解释了这一点:Django says my model is not defined
这是我的models.py:
from django.db import models
#Artist, Album, and Tracks are tables for music albums
class Artist(models.Model):
artist_name = models.CharField(max_length=100, null=False, blank=False)
short_bio = models.CharField(max_length=2000, null=False, blank=False)
albums = models.ManyToManyField(Album)
tracks = models.ManyToManyField(Track)
added = models.DateTimeField(auto_now=True, auto_now_add=False)
updated = models.DateTimeField(auto_now=False, auto_now_add=True)
class Album(models.Model):
album_name = models.CharField(max_length=150, null=False, blank=False)
artists = models.ManyToManyField(Artist)
tracks = models.ManyToManyField(Track)
active = models.BooleanField(default=True)
slug = models.SlugField(null=True, blank=True)
added = models.DateTimeField(auto_now=True, auto_now_add=False)
updated = models.DateTimeField(auto_now=False, auto_now_add=True)
def __unicode__(self):
return self.album_name
class Track(models.Model):
track_name = models.CharField(max_length=200, null=False, blank=False)
artists = models.ManyToManyField(Artist)
album_name = models.ManyToManyField(Album)
class AlbumImage(models.Model):
album_name = models.ForeignKey(Album)
description = models.CharField(max_length=200, null=True, blank=False)
main = models.BooleanField(default=False)
image = models.ImageField(upload_to='albums/images/')
added = models.DateTimeField(auto_now=True, auto_now_add=False)
updated = models.DateTimeField(auto_now=False, auto_now_add=True)
#Book, BookGenre, Author tables for books
class Book(models.Model):
title = models.CharField(max_length=200, null=False, blank=False)
authors = models.ManyToManyField(Author)
pages = models.PositiveSmallIntegerField(null=True, blank=True)
genre = models.ManyToManyField(BookGenre)
active = models.BooleanField(default=True)
slug = models.SlugField(null=True, blank=True)
added = models.DateTimeField(auto_now=True, auto_now_add=False)
updated = models.DateTimeField(auto_now=False, auto_now_add=True)
def __unicode__(self):
return self.title
class Author(models.Model):
author_name = models.CharField(max_length=50, null=False, blank=False)
short_bio = models.CharField(max_length=2000, null=True, blank=True)
titles = models.ManyToManyField(Book)
genre = models.ManyToManyField(BookGenre)
added = models.DateTimeField(auto_now=True, auto_now_add=False)
updated = models.DateTimeField(auto_now=False, auto_now_add=True)
class BookGenre(models.Model):
genre = models.CharField(max_length=50, null=False, blank=False)
class BookImage(models.Model):
title = models.ForeignKey(Book)
description = models.CharField(max_length=200, null=True, blank=False)
main = models.BooleanField(default=False)
image = models.ImageField(upload_to='books/images/')
added = models.DateTimeField(auto_now=True, auto_now_add=False)
updated = models.DateTimeField(auto_now=False, auto_now_add=True)
#Shirt and Colors are for tables exclusively for shirts
class Shirt(models.Model):
title = models.CharField(max_length=50)
description = models.CharField(max_length=2000, null=True, blank=False)
styles = models.ManyToManyField('ShirtStyle.style')
sz_xs = models.PositiveSmallIntegerField(null=False, blank=False)
sz_sm = models.PositiveSmallIntegerField(null=False, blank=False)
sz_md = models.PositiveSmallIntegerField(null=False, blank=False)
sz_lg = models.PositiveSmallIntegerField(null=False, blank=False)
sz_xl = models.PositiveSmallIntegerField(null=False, blank=False)
active = models.BooleanField(default=True)
slug = models.SlugField(null=True, blank=True)
added = models.DateTimeField(auto_now=True, auto_now_add=False)
updated = models.DateTimeField(auto_now=False, auto_now_add=True)
def __unicode__(self):
return self.title
class ShirtStyle(models.Model):
style = models.CharField(max_length=50, null=False, blank=False)
title = models.ForeignKey('Shirt.title')
class ShirtImage(models.Model):
title = models.ForeignKey(Shirt)
description = models.CharField(max_length=200, null=True, blank=False)
main = models.BooleanField(default=False)
image = models.ImageField(upload_to='shirts/images/')
added = models.DateTimeField(auto_now=True, auto_now_add=False)
updated = models.DateTimeField(auto_now=False, auto_now_add=True)
感谢您的宝贵时间。
【问题讨论】:
标签: python database django sqlite django-models