在外键模型中创建其他字段(Django查询)

时间:2018-04-20 15:45:01

标签: python django django-queryset

models.py

from django.db import models

class person(models.Model):
    name = models.CharField(max_length=100, blank=true)
    characteristics = models.ManyToManyField(characteristics, default = '', on_delete=models.SET_DEFAULT)
    def __str__(self):
        return self.name

class characteristics(models.Model):
    name = models.CharField(max_length=100, blank=true)
    def __str__(self):
        return self.name

我在查询集方面遇到了一些麻烦。 我创造了3个人:吉姆,约翰,杰克。 然后创造4个特征:力量,敏捷,智慧,智慧 连接吉姆的力量和灵活性(他强壮而灵巧) 用智慧和智慧联系约翰(他是个聪明人) 用力量,敏捷,智慧和智慧连接杰克(他是所有行业的杰克)

输出将如下:

Jim: strength, agility
John: wisdom, intelligence
Jack: strength, agility, wisdom, intelligence

是否可以为这些特征添加值? 例如:

Jim: strength=10 , agility=10
John: wisdom=10, intelligence=10
Jack: strength=9, agility=8, wisdom=8, intelligence=9

我认为,这些值需要存储在" person"表。我可以在models.py中创建其他字段,但我的目标是在" person"创建新的charactaristics时的模型。

有一种方法可以在" person"中使用0 ... 1000个空int字段。模型,然后给charecteristics提供额外的数字(如id),然后将该特征id与" person" 0 ... 1000个空字段

from django.db import models

class person(models.Model):
    name = models.CharField(max_length=100, blank=true)
    characteristics = models.ManyToManyField(characteristics, default = '', on_delete=models.SET_DEFAULT)
    char0 = IntegerField(blank=True)
    ...
    char1000 = IntegerField(blank=True)
    def __str__(self):
        return self.name

class characteristics(models.Model):
    name = models.CharField(max_length=100, blank=true)
    additional_id = models.BigAutoField
    def __str__(self):
        return self.name

有没有一些优雅的方法来解决我的问题?

2 个答案:

答案 0 :(得分:0)

我认为你需要尝试这样的事情:

    class characteristics(models.Model):
        id = models.AutoField(primary_key=True, )
        name = models.CharField(max_length=100)
        parameter = models.SmallIntegerField(default=0)

接下来你可以这样做:

Jim = person.objects.get(name = Jim)
jims_str = characteristics.objects.create(name = "strengh", parameter = 5)
jims_wisdom = characteristics.objects.create(name = "wisdom", parameter = 2)
Jim.characteristics.add(jims_str)
Jim.characteristics.add(jims_wisdom)
Jim.save()

我可以错过一些细节,但主要逻辑可能就是这样。不同的特征(好的做法是使用Python中的Capital Latter命名类名)可能具有相同的名称,但是具有唯一的PrimaryKey,并且将通过M2M relation连接到Person模型。

       方法2:
您可以修改Person之类的内容:

class Person(models.Model):
    id = models.AutoField(primary_key=True, )
    name = models.CharField(max_length=100)
    strength = models.ForeignKey('Strength', blank=True, null=True, on_delete=models.SET_NULL)
    agility= models.ForeignKey('Agility', blank=True, null=True, on_delete=models.SET_NULL)
    intelligence= models.ForeignKey('Intelligence', blank=True, null=True, on_delete=models.SET_NULL)
    wisdom= models.ForeignKey('Wisdom', blank=True, null=True, on_delete=models.SET_NULL)

接下来创建4个模型:Strength, Agility, Wisdom, Intelligence

class Strength(models.Model):
        id = models.AutoField(primary_key=True, )        
        parameter = models.SmallIntegerField(default=0)

答案 1 :(得分:0)

找到4个解决方案。

第一天(我应该使用它因为没有足够的时间和避风港找到其他适当的方式):

models.py

from django.db import models
class person(models.Model):
    name = models.CharField(max_length=128, blank=False)
    characteristics = models.ManyToManyField(characteristics,
    null=True,
    on_delete=models.SET_NULL)
    characteristics1 = models.FloatField(blank=True, null=True) 
    ....   
    characteristics20 = models.FloatField(blank=True, null=True)

class characteristics(models.Model):
    name = models.CharField(max_length=100, blank=true)
    additional_id = models.BigAutoField

在特征中创建新对象后,对象将获得additional_id(从1开始)。 Lateron将特征与person.characteristicsX连接起来,其中(X = characteristics.additional_id)。 然后,我们可以调用object,并按特性X(其中X = characteristics.additional_id)

对特征进行排序

第二

models.py

from django.db import models

class person(models.Model):
    name = models.CharField(max_length=128, blank=False)
    characteristics = models.ManyToManyField(characteristics,
    null=True,
    on_delete=models.SET_NULL)
    characteristics1_type = models.ForeignKey('characteristics', blank=True, null=True, on_delete=models.SET_NULL)
    characteristics1_value = models.FloatField(blank=True, null=True) 
    ....   
    characteristics20_type = models.ForeignKey('characteristics', blank=True, null=True, on_delete=models.SET_NULL)
    characteristics20_value = models.FloatField(blank=True, null=True) 

class characteristics(models.Model):
    name = models.CharField(max_length=100, blank=True)

可能会引起麻烦,因为用户可以设置2个相同的特性。仍有一种方法可以禁止使用表格等。

第三

models.py

from django.db import models
class person(models.Model):
    name = models.CharField(max_length=128, blank=False)
    characteristics = models.models.TextField(blank=True)

class characteristics(models.Model):
    name = models.CharField(max_length=100, blank=True)

然后使用表单将值保存到person.characteristics字段中。这种方式仍然有效,但随后它需要通过charecteristics.objects对TextField中的信息进行排序。它需要一些时间来设置好,但会很棒。

第四: 使用postgreSQL并存储一个数组。