Django:两个模型之间的两个关系

时间:2020-06-10 11:25:14

标签: django django-rest-framework

我正在努力创建具有两个关系的两个模型。

我的目标是一个人可以拥有多个对象,并且始终拥有自己喜欢的一个对象。

因此,确切地说,约束可以这样总结:

  • 1:n关系人-对象(一个人(专有地)拥有多个对象)
  • n:1关系Person-对象(收藏夹对象,每个人都有一个收藏夹对象)
  • person。(喜欢的对象).owner = person(一个人必须拥有自己喜欢的对象,这使得喜欢的对象的n:1关系更像是“从对象的角度来看是可选的1:1”)
class Person(models.Model):
    favorite_object = models.ForeignKey('Object')


class Object(models.Model):
    owner = models.ForeignKey(Person)

首先,我收到一条错误消息,指出我应该添加一个related_name来帮助解决反向引用,并且我不知道该怎么做,因为从对象的角度看,最喜欢的关系是可选的。

我是否将所有者更改为

    owner = models.ForeignKey(Person, related_name="+")

首先避免反向引用? 但是,如何查询所有者的所有对象? 甚至可以强制我的最爱对象必须归Django模型所有的约束吗?


第二,如何首先创建对象?他们彼此依赖。

在没有喜欢的对象的情况下我无法创建用户,在不知道对象所有者的情况下也无法创建对象。请注意,这对我来说是一个必要的约束。

我会做这样的事情,但是似乎不起作用

with transaction.atomic():
    my_person = Person()
    my_object = Object(owner=my_person)
    my_person.favorite_object = my_object
    my_person.save()
    my_object.save()

例如,我可以允许Object.owner为NULL,但这会放宽我对每个对象都必须拥有所有者的一般约束。

编辑:

似乎

    favorite_object = models.ForeignKey('Object', related_name="+")

而不是排除反向关系可能是一个好主意,因为从对象向所有者进行引用似乎是不必要的。 首先,无论如何,我可以通过owner属性来检查所有者(我的约束是喜欢某个对象的人也是其所有者)。 其次,反向关系并不总是存在。

1 个答案:

答案 0 :(得分:0)

也许您可能在数据库中有一个“虚拟”对象,以使Person()对象具有favorite_object并且不会被创建,然后在创建该人员的同一视图中,使用该人员创建一个对象(将是该人最喜欢的对象),并更新Person()使其具有刚创建的对象,而不是虚拟对象。

我认为它看起来像这样:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class HouseMenu : MonoBehaviour
{
public static bool GameIsPaused = false;
public GameObject HouseMenuUI;

private void OnTriggerEnter(Collider Doorway)
{
    if(Doorway.CompareTag("Player"))
    {
        if (GameIsPaused)
        {
            OutHouse();
        }
        else
        {
            InHouse();
        }
    }
}


public void OutHouse()
{
    HouseMenuUI.SetActive(false);
    Time.timeScale = 1f;
    GameIsPaused = false;
}

void InHouse()
{
    HouseMenuUI.SetActive(true);
    Time.timeScale = 0f;
    GameIsPaused = true;
}


}

在serializers.py中,您只需声明每个模型的注册序列化器即可

@api_view(['POST'])
@permission_classes((AllowAny,))
def api_user_registration_view(request):
    if request.method == 'POST':
        dummy_object = Object.objects.get(name='dummy')
        person_serializer = PersonRegistrationSerializer(favorite_object=dummy_object, data=request.data)
        data = {

        }
        if person_serializer.is_valid():
            person = person_serializer.save()
            object_serializer = ObjectRegistrationSerializer(owner=person)
            if object_serializer.is_valid():
                object_serializer.save()
            else:
                data = serializer.errors
        else:
            data = serializer.errors
        return Response(data)

我希望这对您有所帮助或至少会为您指明正确的方向。