我正在努力创建具有两个关系的两个模型。
我的目标是一个人可以拥有多个对象,并且始终拥有自己喜欢的一个对象。
因此,确切地说,约束可以这样总结:
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属性来检查所有者(我的约束是喜欢某个对象的人也是其所有者)。 其次,反向关系并不总是存在。
答案 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)
我希望这对您有所帮助或至少会为您指明正确的方向。