首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在外键模型中创建附加字段(Django查询)

在外键模型中创建附加字段(Django查询)
EN

Stack Overflow用户
提问于 2018-04-20 15:45:01
回答 2查看 1.2K关注 0票数 0

models.py

代码语言:javascript
运行
复制
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

我对queryset有一些麻烦。我创造了三个人:吉姆,约翰,杰克。然后创造四个特征:力量、敏捷性、智慧、智慧--用力量和敏捷性连接吉姆(他强壮而灵巧)--用智慧和智慧连接约翰(他是个聪明人)--用力量、敏捷、智慧、智慧连接杰克(他是各行各业的杰克)

产出如下:

代码语言:javascript
运行
复制
Jim: strength, agility
John: wisdom, intelligence
Jack: strength, agility, wisdom, intelligence

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

代码语言:javascript
运行
复制
Jim: strength=10 , agility=10
John: wisdom=10, intelligence=10
Jack: strength=9, agility=8, wisdom=8, intelligence=9

我认为,这个值需要存储在"person“表中。我可以在models.py中创建附加字段,但我的目标是在创建新字符时在"person“模型中创建附加字段。

有一种方法可以在"person“模型中使用0.1000个空int字段,然后给出额外的数字(如id),然后将该特征id与"person”0.1000个空字段连接起来

代码语言:javascript
运行
复制
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

有什么好办法解决我的问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-21 11:42:59

找到了4种解决方案。

第一(我应该用它,因为我没有足够的时间,也没有找到其他合适的方法):

代码语言:javascript
运行
复制
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)。然后,我们可以调用对象,并通过characteristicsX进行排序(其中X= characteristics.additional_id)

第二名:

代码语言:javascript
运行
复制
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)

可能会造成麻烦,因为用户可以设置两个相同的特性。但还是有办法禁止它使用表格等。

第三:

代码语言:javascript
运行
复制
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字段。这种方法仍然可以工作,但是它需要通过TextField通过charecteristics.objects对信息进行排序。这将需要一些时间来设置好,但会工作很棒。

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

票数 0
EN

Stack Overflow用户

发布于 2018-04-20 19:15:32

我觉得你应该试试这样的方法:

代码语言:javascript
运行
复制
    class characteristics(models.Model):
        id = models.AutoField(primary_key=True, )
        name = models.CharField(max_length=100)
        parameter = models.SmallIntegerField(default=0)

接下来,您可以:

代码语言:javascript
运行
复制
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中)可能具有相同的名称,但具有惟一的PrimaryKey,并且将通过M2M关系连接到Person模型。

方法2:

您可以编辑Person如下:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
class Strength(models.Model):
        id = models.AutoField(primary_key=True, )        
        parameter = models.SmallIntegerField(default=0)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49945364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档