2009-09-22 65 views
2

好吧,我正在研究一個Django應用程序,它有幾種不同的模型,分別是Accounts,Contacts等,每個模型都有一組不同的字段。我需要能夠允許我的每個用戶除了現有的字段之外定義他們自己的字段。我已經看到了幾種不同的方式來實現這一點,從擁有大量CustomFields並將自定義名稱映射到每個用戶使用的每個字段。對於實現複雜的映射或用戶定義字段的XML/JSON風格存儲/檢索,我似乎也有建議。如何在Django中創建用戶定義的字段

所以我的問題是,有沒有人在Django應用程序中實現用戶定義的字段?如果是這樣,你是如何做到的?你對整體實施(穩定性,性能等)有什麼經驗?

更新:我的目標是讓每個用戶創建n個記錄類型(帳戶,聯繫人等)並將用戶定義的數據與每條記錄相關聯。因此,例如,我的一個用戶可能想要將SSN與他的每個聯繫人關聯,因此我需要爲他創建的每個聯繫人記錄存儲該附加字段。

謝謝!

馬克

+0

你可能想澄清你的目標。您是否想簡單地將任意元數據與這些用戶關聯起來,還是需要按特定字段查找用戶? – 2009-09-23 00:20:58

+0

您可能會尋找這個參考:http://stackoverflow.com/a/7934577/497056 – 2012-02-19 13:31:08

回答

3

如果您使用的是ForeignKey,該怎麼辦?

此代碼(未經測試和演示)假定存在系統範圍的一組自定義字段。爲了使它成爲用戶特定的,你需要在類CustomField上添加一個「user = models.ForiegnKey(User)」。

class Account(models.Model): 
    name = models.CharField(max_length=75) 

    # ... 

    def get_custom_fields(self): 
     return CustomField.objects.filter(content_type=ContentType.objects.get_for_model(Account)) 
    custom_fields = property(get_fields) 

class CustomField(models.Model): 
    """ 
    A field abstract -- it describe what the field is. There are one of these 
    for each custom field the user configures. 
    """ 
    name = models.CharField(max_length=75) 
    content_type = models.ForeignKey(ContentType) 

class CustomFieldValueManager(models.Manager): 

    get_value_for_model_instance(self, model): 
     content_type = ContentType.objects.get_for_model(model) 
     return self.filter(model__content_type=content_type, model__object_id=model.pk) 


class CustomFieldValue(models.Model): 
    """ 
    A field instance -- contains the actual data. There are many of these, for 
    each value that corresponds to a CustomField for a given model. 
    """ 
    field = models.ForeignKey(CustomField, related_name='instance') 
    value = models.CharField(max_length=255) 
    model = models.GenericForeignKey() 

    objects = CustomFieldValueManager() 

# If you wanted to enumerate the custom fields and their values, it would look 
# look like so: 

account = Account.objects.get(pk=1) 
for field in account.custom_fields: 
    print field.name, field.instance.objects.get_value_for_model_instance(account) 
相關問題