Django 中的泛型

Generics in Django

有人可以将此 Java 带有泛型的伪代码翻译成 Django 模型吗?我不明白内容类型的概念。也可以省略地图,只使用 KeyValuePairs 或 KeyValueExamples 列表。

class Dictionary<T extends KeyValuePair>

class KeyValuePair
    String key
    String value

class KeyValueExample extends KeyValuePair
    String example

class Container
    Dictionary<KeyValuePair> itemsOne
    Dictionary<KeyValueExample> itemsTwo

Django 的 contenttypes 与 Java 的泛型没有任何共同之处。 Python 有一个动态类型系统,因此不需要泛型。

这意味着你可以将任何 class 的任何对象放入字典中:

class Container(object):

    def __init__(self):
        self.itemsOne = {}
        self.itemsTwo = {}

container = Container()
container.itemsOne['123'] = '123'
container.itemsOne[321] = 321
container.itemsTwo[(1,2,3)] = "tuple can be a key"

如果你想在 Django 模型中实现你的 classes,那么代码可以是这样的:

class KeyValuePairBase(models.Model):    
    key = models.CharField(max_length=30)
    value = models.CharField(max_length=30)    
    class Meta:
        abstract = True    

class KeyValuePair(KeyValuePairBase):
    pass    

class KeyValueExample(KeyValuePairBase):
    example = models.CharField(max_length=30)    

class Container(models.Model):    
    items_one = models.ManyToManyField(KeyValuePair)
    items_two = models.ManyToManyField(KeyValueExample)

# usage of these models

kvp = KeyValuePair.objects.create(key='key', value='value')
kve = KeyValueExample.objects.create(key='key', value='value',
                                     example='Example text')

container = Container.objects.create()
container.items_one.add(kvp)
container.items_two.add(kve)