- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个计划模型,只能分配 2 个奖励,一个奖励给该计划的成员,另一个奖励给他们的 friend 。
下面是我如何为此设计模型,但现在我开始质疑设计,方案和奖励的链接是否不正确?我应该在抽象奖励上建立相反的关系吗?
方案:
class Scheme(models.Model):
name = models.CharField(max_length=60)
participant_reward_content_type = models.ForeignKey(ContentType,
editable=False,
related_name='%(app_label)s_%(class)s_as_participant',
null=True, blank=True
)
participant_reward_object_id = models.PositiveIntegerField(null=True, blank=True)
participant_reward = generic.GenericForeignKey('participant_reward_content_type', 'participant_reward_object_id')
friend_reward_content_type = models.ForeignKey(ContentType,
editable=False,
related_name='%(app_label)s_%(class)s_as_friends',
null=True, blank=True
)
friend_reward_object_id = models.PositiveIntegerField(null=True, blank=True)
friend_reward = generic.GenericForeignKey('friend_reward_content_type', 'friend_reward_object_id')
奖励:
class AbstractReward(models.Model):
"""
Abstract reward common information shared for all rewards.
"""
description = models.CharField(max_length="150")
active = models.BooleanField(default=True)
#scheme = models.ForeignKey(Scheme, null=True,)
class Meta:
abstract = True
class SingleVoucherReward(AbstractReward):
"""
Single-use coupons are coupon codes that can only be used once
"""
pass
class Meta:
app_label = 'schemes'
class MultiVoucherReward(AbstractReward):
"""
A multi-use coupon code is a coupon code that can be used unlimited times.
"""
code = models.CharField(max_length=200)
expiry = models.DateTimeField(null=True)
class Meta:
app_label = 'schemes'
class CustomReward(AbstractReward):
"""
A reward class used when it can't be handled or they would like to
handle reward fulfillment themselves.
"""
pass
class Meta:
app_label = 'schemes'
最佳答案
我建议保持简单 - http://en.wikipedia.org/wiki/KISS_principle
鉴于 3 种奖励类型的数据定义相似,我将完全失去继承,而只给它一个类型选择:
class Reward(models.Model):
SINGLE = 'Single'
MULTI = 'Multi'
CUSTOM = 'Custom'
TYPE_CHOICES = (
(SINGLE, 'Single'),
(MULTI, 'Multi'),
(CUSTOM, 'Custom'),
)
description = models.CharField(max_length="150")
active = models.BooleanField(default=True)
type = models.CharField(max_length=10, choices=TYPE_CHOICES, default=SINGLE)
code = models.CharField(max_length=200, blank=True)
expiry = models.DateTimeField(null=True)
Two Scoops of Django - 这是关于如何在 Django 中处理事务的一个很好的引用 - 也推荐这种方法。
这也意味着您不需要 GenericForeignKey 并且可以使用简单的外键,从而再次大幅降低复杂性:
class Scheme(models.Model):
name = models.CharField(max_length=60)
participant_reward = models.ForeignKey('Reward', null=True, blank=True)
friend_reward = models.ForeignKey('Rewards', null=True, blank=True)
内置的 Django 管理和 ModelForms 之类的东西将通过这种方法开箱即用。
有些人可能不喜欢 TYPE_CHOICES 的冗长。但维护起来却如此简单明了。
我还意识到,您最终可能会得到 Reward 类上的方法,这些方法必须修改不同类型的行为,例如:
if self.type = CUSTOM:
pass
但这又非常容易维护。您可以使用 Proxy Models如果代码开始真正出现分歧。
有些人可能会说这不是“Pythonic”,但我们在这里不处理纯Python类,除了Zen of Python之外。第三条原则是:
Simple is better than complex.
关于python - 使用 GenericForeignKey 进行 Django 模型设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20940574/
我根据文档编写了此类,以便能够对应用程序中具有 id 的任何内容进行投票: class Vote(models.Model): class Meta: unique_toget
我正在尝试在 Django 中将 ForeignKey 转换为 GenericForeignKey。我计划在三个迁移中执行此操作,mig1、mig2、mig3。 迁移1(mig1)有以下代码 clas
我正尝试在 this tutorial 之后实现事件提要. 当相应的对象(即评论本身)已被删除时,我想删除一个事件(即已添加评论)。这似乎没有级联。 有没有办法在不添加 GenericRelation
我正在创建一个 Django 应用程序,其中所有模型都可以按照用户设置的顺序相互关联。我正在使用 GenericForeignKeys 设置所有这些。关键是我需要能够支持这些类型的关系/管理的多个集合
class MyUser(AbstractBaseUser): ... content_type = models.ForeignKey(ContentType, limit_choi
假设我有一个模型 Box与 GenericForeignKey指向 Apple实例或 Chocolate实例。 Apple和 Chocolate ,反过来,拥有 Farm 的 ForeignKeys和
我正在创建一个自定义评论系统,它可以使用 contenttypes GenericForeignKey 将评论附加到任何模型。 class Comment(models.Model): bod
我更改了 GenericForeignKey() 可以引用的某些对象的默认管理器,以便这些对象可能不再出现在该默认管理器中。 我有其他管理器能够找到这些已删除对象,但我看不出有什么办法可以告诉内容类型
好的,所以我的数据库有一个标题/行类型结构,其中有标题模型,其中有许多行模型。许多型号都采用这种结构。我想跟踪哪些 header 模型与哪些行模型相关。 最初,我只是在 header 模型上有一个指向
重要提示:此问题不再相关。 在 Django 1.7 迁移中,我尝试使用以下代码以编程方式创建评论条目: # -*- coding: utf-8 -*- from __future__ import
我想在 Django Rest Framework 中显示相关 GenericForeignKey 的嵌套表示。这是我尝试过的: class ContentRelatedField(serialize
我是 GenericForeignKey 的新手,我无法让它在查询语句中工作。表格大致如下: class Ticket(models.Model): issue_ct = models.For
我如何根据用户的 content_type 选择创建/处理动态表单? 我正在编写一个 View /模板来添加一个对象,该模型持有其他模型的通用键: class MainModel(models.Mo
我有一个模型,它使用通用外键使用“content_type”字段来存储内容类型和“object_id”来存储对象 ID。该模型需要使用 CRUD API 进行操作,而我正在使用 DRF。我有一个模型的
我正在 Django 中开发一个讨论应用程序,它包含主题、帖子、回复和投票。投票使用 Generic Foreign Keys and Content Types以确保用户只能对特定主题/帖子/回复投
下面的模型显示了一个简单的 GenericForeignKey 关系。它以这种方式设置,以允许任何其他模型重用图像。 class Image(models.Model): name = mod
我有一个事件应用程序来记录用户或任何事件操作。因此,为了实现这一点,我必须在我的模型上使用 GenericForeignKeys,因为许多模型可以执行操作。 这是我的模型: class Activit
我有以下内容: target_content_type = models.ForeignKey(ContentType, related_name='target_content_type') tar
我使用了一个投票应用程序(django-ratings,如果这有什么不同的话),它使用 django 的 GenericForeignKey,有一个用户的 ForeignKey,以及几个其他字段,比如
有没有一种方法可以让 GenericForeignKey 具有与foreignkey连接的两个模型上的字段? from django.db import models from django.cont
我是一名优秀的程序员,十分优秀!