我前几天正在考虑规范化,而且我想到了,我想不出一个数据库中应该有1:1关系的时间.
名称:SSN?我将它们放在同一个表PersonID:AddressID?同样,同桌.
我可以提出一个很多或者很多的例子:很多(有适当的中间表),但从不是1:1.
我错过了一些明显的东西吗
我有两个这样的模型:
class Type1Profile(models.Model):
user = models.OneToOneField(User, unique=True)
...
class Type2Profile(models.Model):
user = models.OneToOneField(User, unique=True)
...
Run Code Online (Sandbox Code Playgroud)
如果用户具有Type1或Type2配置文件,我需要做一些事情:
if request.user.type1profile != None:
# do something
elif request.user.type2profile != None:
# do something else
else:
# do something else
Run Code Online (Sandbox Code Playgroud)
但是,对于没有type1或type2配置文件的用户,执行这样的代码会产生以下错误:
Type1Profile matching query does not exist.
Run Code Online (Sandbox Code Playgroud)
如何查看用户的个人资料类型?
谢谢
我们希望使用Entity Framework Code First使用一对一的可选关系.我们有两个实体.
public class PIIUser
{
public int Id { get; set; }
public int? LoyaltyUserDetailId { get; set; }
public LoyaltyUserDetail LoyaltyUserDetail { get; set; }
}
public class LoyaltyUserDetail
{
public int Id { get; set; }
public double? AvailablePoints { get; set; }
public int PIIUserId { get; set; }
public PIIUser PIIUser { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
PIIUser可能有LoyaltyUserDetail但LoyaltyUserDetail必须有PIIUser.我们尝试了这些流畅的方法技巧.
modelBuilder.Entity<PIIUser>()
.HasOptional(t => t.LoyaltyUserDetail)
.WithOptionalPrincipal(t => t.PIIUser)
.WillCascadeOnDelete(true);
Run Code Online (Sandbox Code Playgroud)
这种方法没有 …
我正在使用现有的架构,我宁愿不改变.架构具有表Person和VitalStats,其中人具有主键和VitalStats使用相同的字段作为其两个主密钥及其外键的人,这意味着它的值是对应的PK的值之间的一对一的关系人
这些记录由外部进程创建,我的JPA代码永远不需要更新VitalStats.对于我的对象模型,我希望我的Person类包含一个VitalStats成员,但是:
当我尝试
@Entity
public class Person{
private long id;
@Id
public long getId(){ return id; }
private VitalStats vs;
@OneToOne(mappedBy = “person”)
public VitalStats getVs() { return vs; }
}
@Entity
public class VitalStats{
private Person person;
@OneToOne
public Person getPerson() { return person; }
}
Run Code Online (Sandbox Code Playgroud)
我有一个问题,即VitalStats没有@Id,这对@Entity不起作用.
如果我试试
@Id @OneToOne
public Person getPerson() { return person; }
Run Code Online (Sandbox Code Playgroud)
解决@Id问题,但要求Person可序列化.我们会回过头来看看.
我可以做VitalStats @Embeddable并通过@ElementCollection连接到人,但那就必须作为一个集合来进行访问,尽管我知道,只有一个元素.可行,但既有点烦人又有点混乱.
那么是什么阻止我只是说Person实现了Serializable?没什么,真的,除了我喜欢我的代码中的所有东西都存在,并且我看不到任何逻辑,这使得我的代码可读性降低.
与此同时,我刚刚用一个很长的人替换了VitalStats中的Person字段并制作了VitalStats的@Id,所以现在@OneToOne正常工作.
所有这些解决方案似乎什么(我)像一个简单的问题是有点笨重,所以我不知道是否我缺少什么,或者是否有人可以至少向我解释为什么人必须是序列化.
TIA
我正在为一个satchmo应用程序组建管理员.Satchmo使用OneToOne关系来扩展基本Product模型,我想在一个页面上编辑它.
OneToOne关系可以作为内联吗?如果没有,最好的方法是将几个字段添加到我的管理员的给定页面,最终将保存到OneToOne关系中?
例如:
class Product(models.Model):
name = models.CharField(max_length=100)
...
class MyProduct(models.Model):
product = models.OneToOne(Product)
...
Run Code Online (Sandbox Code Playgroud)
我为我的管理员尝试了这个但它不起作用,似乎期待一个外键:
class ProductInline(admin.StackedInline):
model = Product
fields = ('name',)
class MyProductAdmin(admin.ModelAdmin):
inlines = (AlbumProductInline,)
admin.site.register(MyProduct, MyProductAdmin)
Run Code Online (Sandbox Code Playgroud)
这引发了这个错误: <class 'satchmo.product.models.Product'> has no ForeignKey to <class 'my_app.models.MyProduct'>
这是自定义表单的唯一方法吗?
编辑:刚尝试以下代码直接添加字段...也不起作用:
class AlbumAdmin(admin.ModelAdmin):
fields = ('product__name',)
Run Code Online (Sandbox Code Playgroud) 我遇到的问题是一对一的延迟加载在休眠中不起作用.我已经解决了,但仍然没有正确理解会发生什么.
我的代码(延迟加载在这里不起作用,当我拉人 - 地址也被提取):
@Entity
public class Person{
@Id
@SequenceGenerator(name = "person_sequence", sequenceName = "sq_person")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "person_sequence")
@Column(name = "id")
private long personID;
@OneToOne(mappedBy="person", cascade=CascadeType.ALL, fetch = FetchType.LAZY)
private Adress address;
//.. getters, setters
}
@Entity
public class Address {
@Id
@Column(name="id", unique=true, nullable=false)
@GeneratedValue(generator="gen")
@GenericGenerator(name="gen", strategy="foreign", parameters=@Parameter(name="property", value="person"))
private long personID;
@PrimaryKeyJoinColumn
@OneToOne
private FileInfo person;
}
Run Code Online (Sandbox Code Playgroud)
但是:如果我添加optional=falseOneToOne关系,延迟加载工作正常!
@OneToOne(mappedBy="person", cascade=CascadeType.ALL, …Run Code Online (Sandbox Code Playgroud) 现在我知道有一对一关系的答案,但他们都没有回答我的问题,所以请在下来之前阅读这个:)
我试图在MySQL数据库中实现一对一的关系.例如,假设我有"用户"表和"帐户表".我想确定用户只能拥有一个帐户.并且每个用户只能有一个帐户.
我找到了两个解决方案,但不知道该使用什么,还有其他选择.
DROP DATABASE IF EXISTS test;
CREATE DATABASE test CHARSET = utf8 COLLATE = utf8_general_ci;
USE test;
CREATE TABLE users(
id INT NOT NULL AUTO_INCREMENT,
user_name VARCHAR(45) NOT NULL,
PRIMARY KEY(id)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
CREATE TABLE accounts(
id INT NOT NULL AUTO_INCREMENT,
account_name VARCHAR(45) NOT NULL,
user_id INT UNIQUE,
PRIMARY KEY(id),
FOREIGN KEY(user_id) REFERENCES users(id)
) ENGINE = InnoDB DEFAULT CHARSET = utf8;
Run Code Online (Sandbox Code Playgroud)
在此示例中,我在指向用户主键的帐户中定义外键.然后我将外键设为UNIQUE,因此帐户中不能有两个相同的用户.要连接表,我会使用此查询:
SELECT * FROM users JOIN accounts ON users.id …Run Code Online (Sandbox Code Playgroud) 我在Django模型中解决关系时遇到了一些困难.
有人可以解释OneToOne,ManyToMany和ForeignKey之间的区别吗?
python django many-to-many one-to-one foreign-key-relationship
我想在SQL Server 2008 R2中创建一对一的关系.
我有两个表tableA和tableB,我设置tableB的主键的外键引用其中tableA的首要.但是当我首先使用Entity Framework数据库时,模型是1到0..1.
任何人都知道如何在数据库中创建真正的1对1关系?
提前致谢!
我有这些简单的课程
Class A(models.Model):
...
Class Meta(models.Model):
a = models.OnetoOneField(A, primary_key=True)
width = models.IntegerField(default=100)
Run Code Online (Sandbox Code Playgroud)
但是当我这样做的时候
a = A()
meta = Meta()
a.save()
meta.a = a
meta.save()
print a.meta.width
Run Code Online (Sandbox Code Playgroud)
我明白了
'A' object has no attribute 'meta'
Run Code Online (Sandbox Code Playgroud)
为什么是这样?我使用OneToOne错了吗?如果是这样,我怎么能得到正确的印刷声明?
谢谢
one-to-one ×10
django ×3
python ×3
sql ×3
database ×2
jpa ×2
c# ×1
django-admin ×1
hibernate ×1
inline ×1
java ×1
lazy-loading ×1
many-to-many ×1
mysql ×1
sql-server ×1