簡體   English   中英

來自多個對象的Django ForeignKey

[英]Django ForeignKey from multiple objects

我正在創建一個應用程序,用戶可以訂閱/關注網站的不同方面。

我正在構建將記錄所有這些訂閱的表。 我最初的直覺是制作一個訂閱表,它將列出訂閱的所有內容。 以下是我現在的計划方法:

class SubscriptionTypeCode(object):
    CITY = '1'
    REGION = '2'
    COUNTRY = '3'
    USER = '4'

SUBSCRIPTION_TYPE_CHOICES = (
    (SubscriptionTypeCode.CITY, 'City'),
    (SubscriptionTypeCode.REGION, 'Region'),
    (SubscriptionTypeCode.COUNTRY, 'Country'),
    (SubscriptionTypeCode.USER, 'User'),
)
class Subscription(models.Model):
    subscriber = models.ForeignKey(User, related_name="subscriber")
    subscription_type = models.CharField(max_length=4, choices=SUBSCRIPTION_TYPE_CHOICES)
    subscription_to_user = models.ForeignKey(User, related_name="subscription_to_user", null=True, blank=True)
    subscription_to_city = models.ForeignKey(City, null=True, blank=True)
    subscription_to_country = models.ForeignKey(Country, null=True, blank=True)
    subscription_to_region = models.ForeignKey(Region, null=True, blank=True)
    created = models.DateTimeField(db_index=True, auto_now_add=True)
    cancelled = models.DateTimeField(null=True, blank=True)

這應該工作,但我想知道這是否是最有效的方法。 每行將具有訂戶ID,然后是類型選擇,然后根據該行,其中一個subscription_to列將具有外部對象。

這是有效的,但在邏輯中需要很多if / else語句。 例如

def create_subscription(request, subscription_type, subscription_id):
    subscription = Subscription.create(
        subscriber = request.user,
        subscription_type = subscription_type,
    )
    if subscription_type == SubscriptionTypeCode.REGION:
        region = get_region(subscription_id)
        subscription.subscription_to_region = region

    elif subscription_type == SubscriptionTypeCode.CITY:
        city = get_city(subscription_id)
        subscription.subscription_to_city = city

    elif subscription_type == SubscriptionTypeCode.COUNTRY:
        country = get_country(subscription_id)
        subscription.subscription_to_country = country

    elif subscription_type == SubscriptionTypeCode.USER:
        user = get_user(subscription_id)
        subscription.subscription_to_user = user

    subscription.save()
    return subscription

有關如何簡化這個的任何想法? 或者這沒關系?

您可以使用通用外鍵 (使用單個subscription_to字段)或模型繼承 (具有Subscription子類用於不同的訂閱類型,這至少可以讓您更好地構建代碼)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM