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
有没有一些优雅的方法来解决我的问题?
答案 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并存储一个数组。