我建立了一個系統來審查葡萄酒和食物。我很快發現自己重複模型和模板,但差異很小。Django在另外兩個人之間共享一個模型
從根本上看,我想要一個審查,以涉及食品或葡萄酒。每種食物或葡萄酒都可以有很多評論。
我有一個FK(目前的方式),只留下一個空白,但鑑於他們如此相似,我決定這不是明智的。
然後,我去了抽象模型,至少能夠字段化字段(新方法),但是因爲我無法鏈接到通用項目模型,所以對於同一個問題我有一個稍微優雅的代碼庫。
研究到這我想知道從食品和葡萄酒到審查的一般關係是要去的方式或內容類型,但我不明白他們如何工作,或者如果他們是我是什麼尋找。
電流的方式 - 葡萄酒有品牌,食品都有專賣店和評論有食品和葡萄酒
class Brand(models.Model):
brand_name = models.CharField(max_length=30)
location = models.ForeignKey(Location, null=True,blank=True)
import datetime
YEAR_CHOICES = []
for r in range(2005, (datetime.datetime.now().year+1)):
YEAR_CHOICES.append((r,r))
YEAR_CHOICES = list(reversed(YEAR_CHOICES))
class Wine(models.Model):
wine_name = models.CharField(max_length=30)
wine_type = models.ForeignKey(WineType)
wine_year = models.IntegerField(choices=YEAR_CHOICES, default=datetime.datetime.now().year)
brand = models.ForeignKey(Brand)
class Store(models.Model):
store_name = models.CharField(max_length=30)
def __str__(self):
return self.store_name
class Food(models.Model):
food_name = models.CharField(max_length=30)
food_desc = models.CharField(blank=True,max_length=100)
store = models.ForeignKey(Store)
def __str__(self):
return self.store.store_name +' - '+self.food_name
class Review(models.Model):
rating = models.CharField(max_length=30)
value = models.CharField(max_length=30)
date = models.DateField(auto_now_add=True)
person = models.ForeignKey(Person)
comment = models.CharField(blank=True,max_length=100)
food = models.ForeignKey(Food, blank=True,default=None,null=True)
wine = models.ForeignKey(Wine, blank=True,default=None,null=True)
class Meta():
ordering = ['-date']
新途徑 - 葡萄酒和食品的物品,商店和專賣店的來源,但評論仍需要兩葡萄酒和食品
class Source(models.Model):
name = models.CharField(max_length=30)
desc = models.CharField(blank=True,max_length=100)
class Meta:
abstract = True
class Item(models.Model):
name = models.CharField(max_length=30)
desc = models.CharField(blank=True,max_length=100)
class Meta:
abstract = True
class WineSource(Source):
location = models.ForeignKey(Location, null=True,blank=True)
class Meta():
ordering = ['location', 'name']
class FoodSource(Source):
def __str__(self):
return self.name
import datetime
YEAR_CHOICES = []
for r in range(2005, (datetime.datetime.now().year+1)):
YEAR_CHOICES.append((r,r))
YEAR_CHOICES = list(reversed(YEAR_CHOICES))
class Wine(Item):
wine_type = models.ForeignKey(WineType)
wine_year = models.IntegerField(choices=YEAR_CHOICES, default=datetime.datetime.now().year)
source = models.ForeignKey(WineSource)
def __str__(self):
return self.source.name +' '+self.name+ ' ' + str(self.wine_type)+ ' '+ str(self.wine_year)
class Food(Item):
source = models.ForeignKey(FoodSource)
def __str__(self):
return self.source.name +' - '+self.name
class Review(models.Model):
rating = models.CharField(max_length=30)
value = models.CharField(max_length=30)
date = models.DateField(auto_now_add=True)
person = models.ForeignKey(Person)
food = models.ForeignKey(Food, blank=True,default=None,null=True)
wine = models.ForeignKey(Wine, blank=True,default=None,null=True)
#Doesn't work as it's abstract- item = models.ForeignKey(Item,null=True)
class Meta():
ordering = ['-date']
環顧四周後,我不能做以下(從http://stackoverflow.com/questions取/ 20895429 /如何,究竟-DO-Django的內容類型工作): 評論= generic.GenericRelation( '審覈') 至於可用性。我還會查找給定葡萄酒的評論(使用某種我不太明白的助手)......這是否有用? 即在模板{%for wine.review_set中進行評論。所有%} – Ewanw
{%for wine.reviews.all%}以及我所能想到的每一個變化都不再有效:/ – Ewanw