python-如何创建具有关系的Django模型,以允许集合中的项目仅在该集合的容器中使用一次
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-如何创建具有关系的Django模型,以允许集合中的项目仅在该集合的容器中使用一次,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2620字,纯文字阅读大概需要4分钟。
内容图文
![python-如何创建具有关系的Django模型,以允许集合中的项目仅在该集合的容器中使用一次](/upload/InfoBanner/zyjiaocheng/681/3804cb7a5d074f40a15bab74ab6e0a71.jpg)
我想为Django ORM创建一个关系,在该关系中,我可以从Set中添加对象,并在该关系中关联数据,但只能将每个项目添加一次到任何给定容器中.我的意思是使用术语集,定义如下:
A set is a well defined collection of distinct objects.
集合中的每个项目SetItem在集合中都是唯一的.我通过在类定义中使用unique = True kwarg定义其字段来确保它们在这种情况下是唯一的.这些项目的容器SetItemContainer与SetItem有关系,该关系允许容器将某些数据与SetItemRelationship相关联.
这是一个ManyToMany关系,但有一点曲折,在任何单独的SetContainer中,每个SetItem A,B,C或D只能有一个.使用“比萨饼”和“浇头”的类比,每个比萨饼可以具有任意数量的浇头,每个“比萨饼”可以根据需要添加任意数量的比萨饼,但是在这种情况下,不能将“浇头”添加到任何单个比萨饼中一次以上,即您不能添加两个任何单个Pizza上的“ Anchovies”浇头(这就是SetItemRelationship中的“数据”所针对的).
您可以在此应用程序的models.py中看到建议的模式
from django.db import models
class SetItem(models.Model):
text = models.CharField(max_length=32, unique=True)
def __unicode__(self):
return self.text
class SetContainer(models.Model):
label = models.CharField(max_length=64)
set_items = models.ManyToManyField(SetItem, through='SetItemRelationship')
def __unicode__(self):
return self.label
class SetItemRelationship(models.Model):
container = models.ForeignKey(SetContainer)
item = models.ForeignKey(SetItem)
data = models.PositiveSmallIntegerField()
def __unicode__(self):
return "{:s} contains {:s}".format(self.container.label, self.item.text)
这种模型关系允许我创建多个SetContainer对象,每个对象都有自己的SetItem对象实例,并与它们关联的数据.但是,我只限于每个关系仅添加一个实例.我试图使用以下admin.py来解决这个问题:
from django.contrib import admin
from .models import SetItem, SetContainer, SetItemRelationship
class SetInline(admin.TabularInline):
model = SetItemRelationship
class SetContainerAdmin(admin.ModelAdmin):
inlines = [SetInline]
admin.site.register(SetContainer, SetContainerAdmin)
admin.site.register(SetItem)
如下面的屏幕截图所示,我能够向具有SetItem.text == A的Unique SetItem添加两个SetItemRelationships.
如何设置关系以防止添加该关系,理想情况下,如何防止添加新SetItemRelationship时下拉列表包含任何先前使用的SetItem.
编辑:我添加了一个解释性段落,包括“比萨饼和馅料”类比,经过修改以帮助解释这种关系.
解决方法:
在我看来,您需要做的是使容器和物料“唯一在一起”,以使同一容器不能多次与同一物料相关.您可以使用Meta类进行此操作:
class SetItemRelationship(models.Model):
container = models.ForeignKey(SetContainer)
item = models.ForeignKey(SetItem)
data = models.PositiveSmallIntegerField()
class Meta(object):
unique_together = (("container", "item"), )
def __unicode__(self):
return "{:s} contains {:s}".format(self.container.label, self.item.text)
内容总结
以上是互联网集市为您收集整理的python-如何创建具有关系的Django模型,以允许集合中的项目仅在该集合的容器中使用一次全部内容,希望文章能够帮你解决python-如何创建具有关系的Django模型,以允许集合中的项目仅在该集合的容器中使用一次所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。