我的模型中有以下两个类:
class Answer(models.Model):
answer = models.CharField(max_length=300)
question = models.ForeignKey('Question', on_delete=models.CASCADE)
def __str__(self):
return "{0}, view: {1}".format(self.answer, self.answer_number)
class Vote(models.Model):
answer = models.OneToOneField(Answer, related_name="votes", on_delete=models.CASCADE)
users = models.ManyToManyField(User)
def __str__(self):
return str(self.answer.answer)[:30]
Run Code Online (Sandbox Code Playgroud)
在外壳中我采取第一个答案:
>>> Answer.objects.all()[0]
<Answer: choix 1 , view: 0>
Run Code Online (Sandbox Code Playgroud)
我想获得 Vote 对象:
>>> Answer.objects.all()[0].votes
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Users\Hippolyte\AppData\Roaming\Python\Python38\site-packages\django\db\models\fields\related_descriptors.py", line 420, in __get__
raise self.RelatedObjectDoesNotExist(
questions.models.Answer.votes.RelatedObjectDoesNotExist: Answer has no votes.
Run Code Online (Sandbox Code Playgroud)
但发生了错误。
我不明白为什么related_name不被识别。你可以帮帮我吗 ?
我应该如何删除grails中hasOne关系中的子对象,例如:
class Face {
static hasOne = [nose: Nose]
}
class Nose {
Face face
static belongsTo= Face
}
Run Code Online (Sandbox Code Playgroud)
我尝试通过两种方式删除子对象
1. face.nose.delete()
2. nose.delete()
Run Code Online (Sandbox Code Playgroud)
我总是得到相同的异常删除对象在两种方式中通过级联重新保存.还有一个针对hasOne的动态方法(如addMo和removeFrom for hasMany)吗?有帮助吗?
考虑以下"模型":
USER
Long: PK
String: firstName
String: lastName
USER_EXT
Long: PK
String: moreInfo
Date: lastModified
Run Code Online (Sandbox Code Playgroud)
我正在尝试查找/创建正确的Hibernate映射(使用Annotations),这样,使用HQL查询就像"来自用户"一样简单,它将生成以下SQL:
select firstName, moreInfo from USER, USER_EXT where user.pk = user_ext.pk
Run Code Online (Sandbox Code Playgroud)
我已经尝试了所有的东西,从使用@Secondarytable到@OneToOne协会,但我不能让它工作.
我现在得到的最好结果是@OneToOne关联生成多个SQL查询,一个用于获取USER中的行,而结果集中的每一行都有一个来自USER_EXT的select查询.
这是非常无效的.
任何的想法 ?
当删除发挥作用时,我对OneToOneField的工作方式感到有些困惑.我能找到的唯一准权威信息来自django-developers上的这个帖子:
我不知道你是否发现了这个,但是删除工作是朝着一个方向发展的,但不是你想要的方向.例如,使用您在另一条消息中发布的模型:
Run Code Online (Sandbox Code Playgroud)class Place(models.Model): name = models.CharField(max_length = 100) class Restaurant(models.Model): place = models.OneToOneField(Place, primary_key=True)如果您创建了与其关联的地方和餐厅,则删除该餐厅将不会删除该地点(这是您在此处报告的问题),但删除该地点将删除该餐厅.
我有以下型号:
class Person(models.Model):
name = models.CharField(max_length=50)
# ... etc ...
user = models.OneToOneField(User, related_name="person", null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
它的成立这种方式让我可以轻松地访问person从User使用实例user.person.
但是,当我尝试删除User管理员中的记录时,自然它会向后传递到我的Person模型,正如线程所讨论的那样,显示了以下内容:
您确定要删除用户"JordanReiter2"吗?以下所有相关项目将被删除:
不用说,我也没有要删除的Person记录,或任何其后代!
我想我理解逻辑:因为Person记录中的OneToOne字段中有一个值,删除User记录会user_id在数据库的列中创建一个错误的引用.
通常,解决方案是切换OneToOne字段所在的位置.当然,这是不可能的,因为User对象几乎是由它设定的django.contrib.auth.
有没有办法防止删除级联,同时仍然有一个直接的方式来访问人user?是创建扩展版本的模型的唯一方法吗?Userdjango.contrib
我改变了模型名称,所以希望它现在更清晰了.基本上,有成千上万的人事记录.不是每个人都有登录,但如果他们这样做,他们只有一个登录.
我将类映射到Drupal生成的现有MySQL表.我需要与表格(一对一)联系,但我遇到了问题.两个表的列nid.这两个字段都是主键.没有主键我无法定义外键.关系图不适用于主键.我的版本如下.
class Node(Base):
__tablename__ = 'node'
nid = Column(Integer, primary_key=True)
vid = Column(Integer)
uuid = Column(String(128))
type = Column(String)
field_data = relationship("NodeFieldData", order_by="NodeFieldData.nid", backref="node")
def __repr__(self):
return "<User(nid='%s', vid='%s', uuid='%s', type='%s')>" % (self.nid, self.vid, self.uuid, self.type)
class NodeFieldData(Base):
__tablename__ = 'node_field_data'
nid = Column(Integer, primary_key=True)
type = Column(String, nullable=False)
title = Column(String, nullable=False)
#nid = Column(Integer, ForeignKey('Node.nid'))
def __repr__(self):
return "<User(nid='%s', vid='%s', uuid='%s', type='%s')>" % (self.nid, self.vid, self.uuid, self.type)
Run Code Online (Sandbox Code Playgroud)
谢谢.
创建模型的两个实例并使用OneToOneField连接它们时,将创建连接并在创建对象时自动保存:
from django.db import models
class MyModel(models.Model):
name = models.CharField(primary_key=True, max_length=255)
next = models.OneToOneField('self', on_delete=models.SET_NULL, related_name='prev', null=True, blank=True)
>>> m2 = MyModel.objects.create(name="2")
>>> m1 = MyModel.objects.create(name="1", next=m2)
>>> m2.prev
<MyModel: 1>
>>> m2.refresh_from_db()
>>> m2.prev
<MyModel: 2>
Run Code Online (Sandbox Code Playgroud)
但是,在创建相同的连接但使用反向字段时,创建也会自动完成,但不会保存.
>>> m1 = MyModel.objects.create(name="1")
>>> m2 = MyModel.objects.create(name="2", prev=m1)
>>> m1.next
<MyModel: 2>
>>> m1.refresh_from_db()
>>> m1.next
Run Code Online (Sandbox Code Playgroud)
请注意,最后一个语句在返回后不会打印任何内容 None
如何在使用反向字段创建时始终保存关系,而无需.save()每次都手动使用?
django foreign-keys django-models one-to-one relational-database
我在服务和 Lexikon 之间有一对一的关系,而服务有 Lexikon 的外键。我的服务不需要 Lexikon,因此我将 LexikonID 设置为可为空。但我的 Lexikon 仅当与服务相关时才能存在,因此我将导航属性设置为 [必需]。我使用的是 Code First,因此 EF 构建了我的数据库。
public class Service
{
public int ServiceID { get; set; }
//Foreignkey
public int? LexikonID { get; set; }
//Navigation Properties
public Lexikon Lexikon { get; set; }
}
public class Lexikon
{
public int LexikonID { get; set; }
//Navigation Properties
[Required]
public SoftwareService SoftwareService { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果我删除我的服务,我会尝试自动删除 Lexikon 表中的数据,但不幸的是,我不知道如何执行此操作,因为我是 EF 新手。
我在 dbContext 中尝试了以下代码:
modelBuilder.Entity<SoftwareService>()
.HasOne(l => l.Lexikon)
.WithOne(s => …Run Code Online (Sandbox Code Playgroud) c# entity-framework cascade one-to-one entity-framework-core
我正在使用 JPA 为具有复合键的数据库定义数据模型。我无法更改数据库。
我有一个Car带有复合键(carType 和 carId)的实体。第二个(可选)PorscheInfo实体包含保时捷汽车的附加信息。不幸的是,相应的“porsche_info”表不包含包含 carType 信息的列,因为其条目专门引用CarType = 'Porsche'。
此操作的 SQL 很简单:
SELECT *
FROM cars
LEFT JOIN porsche_info
ON cars.CarId = porsche_info.CarId
AND cars.CarType = 'Porsche'
Run Code Online (Sandbox Code Playgroud)
如何将其转换为正确的 JPA 设置?
到目前为止,我有以下实体类:
@Embeddable
public class CarKey {
private String carType;
private String carId;
}
@Entity(name = "cars")
public class Car {
@EmbeddedId
private CarKey key;
// car information
@OneToOne
@JoinColumn(name = "CarId", referencedColumnName = "CarId")
private PorscheInfo porscheInfo;
// or
@OneToMany
@JoinColumn(name = "CarId", …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 R 中创建一个程序,用三位数机场代码替换城市名称或机场名称。我想要进行模糊匹配以提供更大的灵活性,因为我试图替换的城市/机场名称的数据来自许多不同的来源。我的问题是,通过模糊匹配左连接,我似乎无法找到一种方法来仅从右表(代码)返回与左表(名称)最接近的匹配。
例如:将城市奥古斯塔 (Augusta, GA) 与奥古斯塔 (Augusta, GA) 和奥古斯塔 (Augusta, ME) 进行匹配并复制数据。我不想限制最大距离,因为我仍然想允许灵活性,但我不能让我的数据重复。我想找到一种方法来进行部分字符串匹配,但只返回最接近的结果。
我尝试过使用 fuzzyjoin 包,但从我所见,没有办法限制只有一场比赛或只有最佳比赛。我知道在 pmatch 中有一个禁止重复的调用,但我找不到使 pmatch 作为连接工作的方法。
data <- stringdist_left_join(data, orig, ignore_case = TRUE)
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的代码,stringdist 是 R 中 fuzzyjoin 包的函数。数据集“data”包含城市名称、航班数量和其他乘客信息。“orig”数据集有一列城市/机场名称和机场代码
SAMPLE INPUT
**data table:**
City Name Passenger Name Fare Paid
Augusta, GA Jon $100
Dallas, TX Jane $200
Spokane, WA Chris $300
**orig table:**
City Name Code
Augusta, GA JCL
Dallas, TX DAL
Denver, CO DEN
Seattle, WA SEA
Spokane, WA GEG
Austin, TX AUS
Augusta, ME …Run Code Online (Sandbox Code Playgroud) one-to-one ×10
django ×3
hibernate ×3
jpa ×2
python ×2
c# ×1
cascade ×1
foreign-keys ×1
fuzzy ×1
fuzzyjoin ×1
grails ×1
hql ×1
mapping ×1
one-to-many ×1
r ×1
sqlalchemy ×1