【问题标题】:django - many-to-many and one-to-many relationshipsdjango - 多对多和一对多关系
【发布时间】:2015-07-05 14:03:29
【问题描述】:

我在 django 工作,正在为用户规划一个游乐设施数据库。

  • 每个用户可以在多个游乐设施上(随着时间的推移),每个游乐设施可以有多个用户(乘客)在里面。

  • 此外,对于每个 Ride,必须只有一个 Driver(也是 User),所以我认为我在Rides 和 Users 表,用于显示 user 在什么 ride 上,以及 Rides 的 Driver_id 和 User_id 之间的一对多关系。对吗?

我的问题是-

  1. 我在 django 文档中看到我应该在 One 模型中放置一个多对多字段。哪一个有关系吗?还有,它是否会创建一个新表,比如rides_users?

  2. 还有,使用 foreignKey 字段和 OneToManyField 有什么区别(一对多关系) > 领域?

编辑:

目前,有我的模型:

def get_image_path(models.Model):
    return os.path.join('photos',str(instance.id),filename)


class UserProfile(models.Model):
    user=models.OneToOneField(User)
    phone_number=models.CharField(max_length=12)
    profile_picture=models.ImageField(upload_to=get_image_path, black=True, null=True)

class Ride(models.Model):
    driver=models.ForeignKey(UserProfile, related_name="r_driver")
    destination=models.ForeignKey(Destination, related_name="r_final_destination")
    leaving_time=models.DateTimeField()
    num_of_spots=models.IntergerField()
    passengers=models.ManyToMany(UserProfile, related_name="r_passengers")
    mid_destinations=models.ManyToMany(Destination, related_name="r_mid_destinations")

class Destination(models.Model):
    name=models.CharField(max_length=30)

如您所见,每个行程都有 多个 mid_destination 和 多个 乘客。 a Ride也有一个司机和一个最终目的地。

问题是 -用户 添加 Ride 时,我想要 司机目的地mid_destinations 以及由 用户 设置的其余字段(司机是添加乘车的用户),除外 对于 passengers 字段。我希望其他用户将自己添加到游乐设施中,因此在创建游乐设施时,用户(司机)不必设置乘客。

我该怎么做?还有,关于模型的任何其他建议?

【问题讨论】:

    标签: django database many-to-many many-to-one


    【解决方案1】:

    没有 OneToManyField 这样的东西。

    从实际的角度来看,ManyToManyField 存在于哪一边并不重要。就我个人而言,我会将它放在 Ride 上,既是为了避免更改 User 模型,也是因为从概念上讲,我会说游乐设施是这里的主要对象。

    是的,添加字段将自动创建链接表。

    【讨论】:

    • 感谢您的回答。我的意思是一个 ManyToOne 字段,有这样的东西吗?如果是这样,我使用foreignKey 还是ManyToOne?对于多对一关系
    • 不,也不存在这样的事情。为什么你会认为有?文档没有提到它。
    • 我想起了一些与之相关的事情。没关系,我猜我错了。还是谢谢!
    • 我编辑了问题并添加了我当前代码的另一个问题。非常感谢您的帮助:)
    • 请不要那样做:问一个新问题。
    【解决方案2】:

    你想要的大概是这样的

    class MyModel(models.Model):
    
        driver = models.ForeignKey(to=User, related_name='r_driver')
        # you need to use a related name if you want to link to the same model more than once
        passengers = models.ManyToManyField(User, related_name="r_passengers")
    

    【讨论】:

    • 感谢您的回答。外键中的“to=user”是什么意思?
    • 来自def __init__(self, to, to_field=None, rel_class=ManyToOneRel, db_constraint=True, **kwargs):
    • 好吧,你为什么把它放在 ForeignKey 字段而不是 ManyToMany 字段?我的意思是,我不太确定它在做什么,到目前为止我还没有使用它,只需将模型名称放在 ManyToMany 中即可。另外 - 我用我的新 Ride 和其他模型编辑了我的问题,还添加了我在问题中遇到的另一个问题。任何帮助将不胜感激
    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    相关资源
    最近更新 更多