Select model object which is not related through a RelatedField

I have 2 models :

class ModelA(Model):
    _id = UUIDField(primary_key=True)
   object_id = UUIDField()
   object_version=IntegerField()
class ModelB(Model):
    object_id = UUIDField()
    meta = CharField(max_length=100)

_id Field in ModelA is pk. object_id and object_version will be unique together. But object_id remains same across different versions of ModelA instances.

Now ModelB has object_id which is referring (not through relations) to object_id field of ModelA. I don’t want to create ModelB instance for each version of ModelA and want to keep just non duplicate instance of ModelB for all version of ModelA.

In the queries I want to use meta field on each version of ModelA instance, but I am not able to find a way unless I create a relation to the ModelB. Is there a way to query ModelB fields in filter for queryset of ModelA using my current design?

Also FYI, there can be multiple modelB instances for a particular object_id.

One thing i could think of is to add m2m in my modelA but that would require me to fetch the modelB instance first which increases a db query while creation. Can anyone help

Hi Sarthak1996,

Can you clear up some confusion for me. You state:

I don’t want to create ModelB instance for each version of ModelA and want to keep just one instance of ModelB for all version of ModelA .

But then at the end indicate:

Also FYI, there can be multiple modelB instances for a particular object_id .

Those are contradictory given the information you’ve provided so far. Can you elaborate on those?

I’m considering suggesting creating a new model that’s only field would be object_id which would be unique. Then you can create ForeignKey or OneToOneField relationships to that model as needed.

Thanks,
Tim

@CodenameTim
Consider the following:

ModelA instances (using dummy values for clarity, in reality it would be UUID):

[
   {_id:'uid1',object_id:'a',object_version:1},
   {_id:'uid2',object_id:'a',object_version:2},
   {_id:'uid3',object_id:'a',object_version:3},
   {_id:'uid4',object_id:'a',object_version:4}
]

ModelB instances:

[
   {id:1,object_id:'a',meta:'user_details'},
   {id:2,object_id:'a',meta:'group_details'},
]

As you can see there are 2 instances of ModelB mapped to object_id:a of ModelA. Right now you see only 2 ModelB instances for 4 instances of ModelA.

What I meant by that is that not to create duplicate instances of ModelB for each instance of ModelA which have same object_id. Don’t want to add m2m as it increases a db query on create. All I want to do is access the ModelB instance while doing filter (like the way we do for relatedFields).

I’m considering suggesting creating a new model that’s only field would be object_id which would be unique.

I think this will not work in my case as there are multiple ModelB instances for one object_id.

Can’t use to_field in ForeignKey as the field should be unique

Given the additional information, I’m going to suggest you normalize your data model and move object_id into its own model.

class BaseObject(Model):
    object_id = UUIDField(unique=True)

class ModelA(Model):
    base = ForeignKey(BaseObject)
    version = IntegerField()

class ModelB(Model):
    base = ForeignKey(BaseObject)
    meta = CharField()

Now you have the ability of find the related ModelA instances for a given ModelB instance and vice versa.

That’s brilliant :scream:

Thanks a lot @CodenameTim

You’re welcome, best of luck!